2013-06-23 168 views
0

我想測量使用OpenGL ES 2.0的各種Android設備的渲染性能。我通過繪製(紋理)四分之一大小的屏幕並繪製N次來完成此操作。其基本思路是這樣的:測量渲染時間OpenGL ES 2.0

start = System.currentTimeMillis(); 
for (int i = 0; i < N; ++i) { 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, v_n); 
} 
GLES20.glFinish(); 
time = System.currentTimeMillis()-start; 

在現實中,我存儲值和測量平均超過一定數額的渲染通道,但這不是問題。這種方法似乎與我的設備(三星Galaxy SIII)和HTC Legend相得益彰。但是,三星Galaxy S似乎忽略了glFinish(),導致渲染速度相當激烈(但錯誤)。我之前看過有些設備並沒有真正收聽glFinish(),但如果不是這樣,我怎麼測量渲染速度?

我也曾嘗試我所看到的所有在互聯網(主要是衡量FPS的情況下)的另一種方式:

@Override 
public void onDrawFrame(GL10 unused) { 
    time = System.currentTimeMillis()-start; 
    //store time somewhere 
    start = System.currentTimeMillis(); 
    ... 
    //rendering here 
    ... 
} 

在這裏,你測量的時間在下次呼叫開始到onDrawFrame(..)與除非以前的渲染已經完成,否則它不會被調用。但是這會導致同樣的問題。

還有別的辦法嗎?或者我應該避免使用這些設備進行性能測量?

回答

4

測量GPU性能可能會非常棘手。有許多事情你必須考慮,比如圖形驅動程序如何解釋glFlush/glFinish以及VSync如何影響結果。

調用glFinish()每幀永遠不會提供延遲工作的GPU(如PowerVR)上的性能的真實表示,因爲架構依賴於並行處理多個幀以實現最佳性能。在glFinish()調用得到遵守的設備上(即CPU線程阻塞直到GPU渲染完成),您的測試將導致渲染被序列化,這將導致顯着的性能下降。此外,在GPU工作完成之前阻塞CPU線程將引入另一大開銷。

當啓用Vsync時,您還將測量GPU等待翻轉發生的時間。如果可能的話,應該在運行像這樣的性能測試或渲染離屏(即FBO)時禁用Vsync,這樣可以避免vsync限制。或者,您可以使用GPU分析工具(例如Imagination的PVRTune)獲取處理渲染所用GPU時間的準確時間信息。

Imagination博客上的"Micro-benchmark your render on PowerVR Series5, Series5XT and Series6 GPUs"帖子解釋了編寫像這樣的性能測試的最佳實踐。

+0

謝謝,非常有幫助的信息。但是,足夠高的N會不會降低「glFinish()」在性能上的重要性?我只對單個框架的渲染感興趣,看看場景中的某些變化是如何影響渲染時間的。 – Reigertje

+0

無論您渲染多少幀,'glFinish()'都會在任何呼叫受到尊重的設備上產生顯着的性能。 推遲的GPU將一次至少有兩個幀在運行,例如在幀__n-1__中着色片段的同時轉換幀__n__的頂點。通過調用'glFinish()',您將強制GPU將其工作負載序列化,從而降低其效率。 –

+0

我明白,但是在我的概念中,我真的只有一個框架。從來沒有一個框架在等待另一個框架。 'for(int i = 0; i Reigertje

0

您還可以使用應用程序,如GameBench在任何Android設備上工作,並將測量FPS。它還可以檢索使用Adreno和IMG GPU的設備的GPU使用情況。該應用程序還收集屏幕截圖,以便您瞭解幀速率下降時發生的情況。