我想測量使用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(..)
與除非以前的渲染已經完成,否則它不會被調用。但是這會導致同樣的問題。
還有別的辦法嗎?或者我應該避免使用這些設備進行性能測量?
謝謝,非常有幫助的信息。但是,足夠高的N會不會降低「glFinish()」在性能上的重要性?我只對單個框架的渲染感興趣,看看場景中的某些變化是如何影響渲染時間的。 – Reigertje
無論您渲染多少幀,'glFinish()'都會在任何呼叫受到尊重的設備上產生顯着的性能。 推遲的GPU將一次至少有兩個幀在運行,例如在幀__n-1__中着色片段的同時轉換幀__n__的頂點。通過調用'glFinish()',您將強制GPU將其工作負載序列化,從而降低其效率。 –
我明白,但是在我的概念中,我真的只有一個框架。從來沒有一個框架在等待另一個框架。 'for(int i = 0; i
Reigertje