我使用GLSurfaceView.Renderer
以常规方式使用OpenGL ES 2.0渲染3D图形。
所有渲染代码都在onDrawFrame()
方法中,并且当定时需要大约24ms才能完成;这很容易给出30 FPS的结果。
但是我发现onDrawFrame()
调用本身通常每隔50到100毫秒被调用一次,因此onDrawFrame()
的总时间实际上是70到120毫秒,最多可以得到14 FPS的结果。 / p>
为什么android需要这么长时间来调用onDrawFrame()
?在stackoverflow和其他地方读到这个,我收集onDrawFrame()
"锁定"直到GPU渲染了帧,所以我想知道我的GPU渲染是否会花费很长时间,而不是Android中特定的东西导致延迟?
答案 0 :(得分:0)
是的,根据您的描述,GPU上的渲染很可能会限制您的帧速率。
想象您的OpenGL调用将工作提交给GPU。完成onDrawFrame()
调用中的所有代码后,这意味着您的所有渲染都已提交给GPU 。但这并不意味着GPU已经完成了工作。这可能会花费任意长的时间,具体取决于您提交的作品的数量和复杂程度。
在Android中,系统将尝试以显示刷新率(通常为60 Hz)重绘。但是如果GPU由于渲染过于复杂而无法每秒产生60帧,那么仍然每秒60次调用onDrawFrame()
方法是没有意义的。这将导致越来越多的GPU工作排队,导致越来越多的系统资源用于挂起的GPU命令,以及代码之间的延迟增加,使得渲染调用和结果显示在显示器上。
为了避免这种不良行为,系统会将对onDrawFrame()
的调用限制在GPU可以跟上渲染您生成的帧的程度。它可能会让你比GPU已经完成的帧提前1或2帧,但是会阻止,直到GPU完成足够的工作,然后再要求你绘制另一帧。