Opengl ES 2.0-为什么glFinish在我的新android手机上给我的帧率比旧的更低?
作者:互联网
我最近将旧的Galaxy S2手机升级到了全新的Galaxy S7,很惊讶地发现我编写的旧游戏在新手机上的表现似乎较差.在将所有内容简化为一个简单的项目之后,我发现了问题-我在每个onDrawFrame末尾执行的GLES20.glFinish()调用.有了glClear但没有绘制调用,FPS徘徊在40左右.没有glFinish的稳定60 FPS.不管怎样,我的旧S2都有60 FPS.
然后,我回到游戏中,并删除了glFinish方法调用,并确保足够的性能恢复到完美状态,并且删除它没有明显的不利影响.
为什么glFinish会降低我的新手机的帧速率而不是旧手机的帧速率?
解决方法:
我认为投机性的答案就已经足够了,所以–几乎可以肯定的是,重复很多您已经知道的事情,我们深表歉意:
发送到OpenGL的命令会经历三种状态,分别相对于GPU端命名:
>未提交
>已提交但未决
>完成
与运行GPU的代码进行通信通常很昂贵.因此,大多数OpenGL实现都接受您的调用,并且只是在内存空间中排队一段时间.在某个时候,它将确定通信是合理的,并将支付一次转移所有呼叫的费用,将其升级为已提交状态.然后,GPU将完成每个任务(可能会不按顺序完成,前提是不破坏API).
glFinish:
… does not return until the effects of all previously called GL
commands are complete. Such effects include all changes to GL state,
all changes to connection state, and all changes to the frame buffer
contents.
因此,在该CPU线程可能正在做其他事情的一段时间内,现在肯定不会.但是,如果您不glFinish,那么您的输出可能仍会出现,只是不清楚何时. glFlush通常是正确的转发方式-它会将所有内容提前提交,但不等待完成,因此,所有内容肯定会很快出现,您只是不必等待它.
OpenGL与OS的绑定差异很大.通常,尽管您几乎肯定希望在环境允许的情况下进行冲洗而不是冲洗.如果刷新或结束操作均有效,并且操作系统未根据任何条件为您提供帮助,则可能会导致一些额外的延迟(例如,发出一帧的命令可能要等到填满后才能到达GPU在下一帧中再次提交未提交的队列),但是如果您无限期地执行GL工作,那么几乎可以肯定,输出仍将继续.
Android位于EGL之上.按照规范3.9.3:
…
eglSwapBuffers
andeglCopyBuffers
perform an implicit flush operation
on the context …
因此,我相信如果您使用双重缓冲,则无需在Android中执行刷新或完成操作.绘图完成后,调用交换缓冲区将导致缓冲区交换,而不会阻塞CPU.
至于真正的问题,S7具有Adreno 530 GPU. S2具有Mali T760MP6 GPU. Malis由ARM生产,Qualcomm由Adrenos生产,因此它们是完全不同的体系结构和驱动程序实现.因此,造成阻塞的差异几乎可以是任何东西.但这是允许的. glFinish不是必需的,它是一种非常钝的工具;它可能不是主要的优化目标之一.
标签:frame-rate,performance,opengl-es,android 来源: https://codeday.me/bug/20191027/1942293.html