2014-11-01 277 views
0

我有一个游戏使用GLSurfaceView.Renderer在通常的方式来渲染与OpenGL ES 2.0的3D图形。 所有的渲染代码都在onDrawFrame()方法中,并且当定时需要大约24ms才能完成;这很容易给出30 FPS的结果。 但是我发现onDrawFrame()调用本身通常只会每50到100ms被调用一次,因此onDrawFrame()的总时间实际上是70到120毫秒,最多给出14 FPS的结果。Android的onDrawFrame()大规模延迟

为什么android会花费这么长的时间来调用onDrawFrame()?在stackoverflow和其他地方读到这个,我收集onDrawFrame()“锁”,直到GPU渲染帧,所以我不知道是否它可能是我的GPU渲染花费很长时间,而不是Android中特定的东西造成延迟?

回答

0

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

将你的OpenGL调用画面提交给GPU。在onDrawFrame()调用中的所有代码完成后,这意味着您的所有渲染已被提交给GPU。但这并不意味着GPU已经完成了这项工作。这可能需要很长时间,具体取决于您提交的作品的数量和复杂程度。

在Android中,系统将尝试以刷新频率(通常为60 Hz)重新绘制。但是如果GPU不能每秒产生60帧,因为渲染过于复杂,那么仍然每秒调用onDrawFrame()方法60次没有意义。这会导致越来越多的GPU工作排队,导致越来越多的系统资源被用于待处理的GPU命令,并且增加了渲染调用的代码与显示结果之间的延迟。

为了避免这种不良行为,系统将调用onDrawFrame(),以使GPU可以跟上您生成的帧。它可以让你在GPU已经完成的情况下获得1或2帧,但是在GPU要求你绘制另一帧之前已经完成了足够的工作之前,它会被阻挡。