我正在尝试分析我的渲染器,但我看到了一些我无法解释的奇怪的分析行为。
我正在使用 glSurfaceView,我已将其设置为连续渲染。
这就是我onDrawFrame()
的结构
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
这在轻负载下表现得很慢,所以我创建了一个计时器类并开始对其进行分析。我对我所看到的感到非常惊讶。
我对我的 onDrawFrame 方法进行了一些探测,如下所示:
public void onDrawFrame(GL10 unused) {
swapTimer.end();
clearTimer.start();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
clearTimer.end();
drawTimer.start();
executeAllDrawCommands();
drawTimer.end();
swapTimer.start();
}
clearTimer
测量调用 glClear 所需drawTimer
的时间,测量运行我的所有绘图调用swapTimer
所需的时间,并测量从 onDrawFrame 退出到它返回的时间(调用 eglSwapBuffers 所用的时间)。
当我运行一个负载非常轻的场景时,我得到了一些我无法解释的非常奇怪的数字:
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
我预计交换时间会有点长,因为我相信设备在 ~30fps 时强制启用 vsync,但我不知道为什么实际的“清除”调用会阻塞 11 毫秒?我以为它只是应该发出一个异步命令并返回?
当我画一个更繁忙的场景时,数字变化很大:
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
在这个场景中,我的绘图调用花费了太多时间,以至于它看起来隐藏了很多垂直同步周期,并且清除调用上的阻塞完全消失了。
有什么解释为什么 glClear 在我的轻载场景中阻塞?
链接到我的“计时器”类源代码,以防有人怀疑我的测量技术: http: //pastebin.com/bhXt368W