我正在试图描绘我的渲染器,而且我看到一些我无法解释的奇怪分析行为。为什么glClear在OpenGLES中被阻塞?
我正在使用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)
我预期的交换时间是有点稍大,因为我相信该设备具有强制VSYNC以〜30fps启用,但我不知道为什么实际的'清除'呼叫阻塞11毫秒?我以为它只是应该发出一个异步命令并返回?
当我得出一个更加繁忙景象,数字改变了不少:
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
在这个场景我绘制调用正在采取这么多的时间,它看起来像它隐藏了许多的VSYNC周期的,并且清除通话中的区块完全消失。
有没有解释为什么glClear会在我轻微加载的场景中阻塞?
链接到我的“定时器”类源代码的情况下,有人怀疑我的测量技术:http://pastebin.com/bhXt368W
您可以尝试在clearTimer.start()方法之前调用GLES20.glFinish(),然后查看时间如何变化? –
我放了一个'glFinish'(和finishTimer.start()/ end()),它需要所有的时间远离glClear。相反,现在glFinish需要几毫秒,glClear变为即时。看起来这和所有的vsync都有关系,尽管我很惊讶地发现vsync时间出现在glClear中。 – Tim