Android onDrawFrame()大量延迟

时间:2014-11-01 17:59:07

标签: android opengl-es opengl-es-2.0 glsles

我使用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中特定的东西导致延迟?

1 个答案:

答案 0 :(得分:0)

是的,根据您的描述,GPU上的渲染很可能会限制您的帧速率。

想象您的OpenGL调用将工作提交给GPU。完成onDrawFrame()调用中的所有代码后,这意味着您的所有渲染都已提交给GPU 。但这并不意味着GPU已经完成了工作。这可能会花费任意长的时间,具体取决于您提交的作品的数量和复杂程度。

在Android中,系统将尝试以显示刷新率(通常为60 Hz)重绘。但是如果GPU由于渲染过于复杂而无法每秒产生60帧,那么仍然每秒60次调用onDrawFrame()方法是没有意义的。这将导致越来越多的GPU工作排队,导致越来越多的系统资源用于挂起的GPU命令,以及代码之间的延迟增加,使得渲染调用和结果显示在显示器上。

为了避免这种不良行为,系统会将对onDrawFrame()的调用限制在GPU可以跟上渲染您生成的帧的程度。它可能会让你比GPU已经完成的帧提前1或2帧,但是会阻止,直到GPU完成足够的工作,然后再要求你绘制另一帧。