我正在試圖描繪我的渲染器,而且我看到一些我無法解釋的奇怪分析行爲。爲什麼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