2012-09-01 117 views
8

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

+0

您可以嘗試在clearTimer.start()方法之前調用GLES20.glFinish(),然後查看時間如何變化? –

+0

我放了一個'glFinish'(和finishTimer.start()/ end()),它需要所有的時間遠離glClear。相反,現在glFinish需要幾毫秒,glClear變爲即時。看起來這和所有的vsync都有關係,儘管我很驚訝地發現vsync時間出現在glClear中。 – Tim

回答

10

我把glfinish在(和finishTimer.start()/()結束周圍),和它需要所有的時間遠離glClear。相反,現在glFinish需要幾毫秒,glClear變爲即時。

這就解釋了它。

當您的場景非常輕時,繪圖渲染速度非常快時,用新顏色清理並填充像素所需的時間將需要一些時間(這將需要一定的時間(否則渲染器會落後並且是當前繪圖新的東西)。較新的Android設備具有填充限制。例如,Nexus One具有30 Hz的填充率鎖定 - 無論您的實際圖紙進行得多快,屏幕都將以該頻率進行同步。如果圖形在30 Hz以下完成,則渲染器將與屏幕同步。這就是爲什麼您會注意到這種延遲,即使您刪除了glClear()呼叫,您也應該注意這種延遲。渲染器在屏幕更新之前並快於屏幕更新。

當渲染器有許多要繪製的對象時,由於渲染器現在在屏幕更新之後,同步將停止(給定繁忙場景的配置文件數據)。

當使用glFinish(),它消除了時間的函數glClear()否則會引起,其中,通過以下的填充率的邏輯,意味着glFinish()現在是確保與屏幕同步的功能。

計算

F = 1/T

易場景

F = 1/T = 1 /((20 + 11 + 2)×10^- 3)=〜30 Hz

同步的延遲時間出現在您的分析器中。渲染器正在與屏幕同步。這意味着如果您刪除glClear()glFinish()呼叫,延遲會出現在其他地方。

重型場景

F = 1/T = 1 /((2 + 0 + 44)×10^-3))=〜22赫茲

同步的延遲時間不出現在您的分析器中。渲染器在屏幕更新頻率之後。

好像這是所有涉及到VSYNC

這似乎是正確的。

相關問題