Rei*_*tje 0 performance android opengl-es-2.0
我想使用OpenGL ES 2.0评估各种Android设备上的渲染性能。我通过绘制(带纹理的)四边形屏幕大小并绘制N次来做到这一点。基本思想如下:
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;
Run Code Online (Sandbox Code Playgroud)
实际上,我存储这些值并在一定数量的渲染过程中测量平均值,但这不是问题。这种方法似乎与我的设备(三星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
...
}
Run Code Online (Sandbox Code Playgroud)
在这里,您测量下一次调用开始时的时间,onDrawFrame(..)以免除非先前的渲染完成才调用它。但这导致了同样的问题。
还有另一种方法吗?还是我应该避免使用这些设备进行性能测量?
小智 5
测量GPU性能可能很棘手。您需要考虑很多事情,例如图形驱动程序如何解释glFlush / glFinish以及VSync如何影响结果。
每帧调用glFinish()永远不会真正表示延迟工作的GPU(例如PowerVR)的性能,因为该体系结构需要并行处理多个帧才能获得最佳性能。在执行glFinish()调用的设备上(即,CPU线程阻塞,直到GPU渲染完成为止),您的测试将导致渲染序列化,这将对性能造成重大影响。同样,阻塞CPU线程直到GPU工作完成会带来另一大开销。
启用Vsync后,您还将测量GPU等待翻转发生的时间。如果可能的话,您应在运行此类性能测试时禁用Vsync或在屏幕外渲染(即渲染到FBO),以便避免vsync限制。另外,您可以使用Imagination的PVRTune之类的GPU分析工具来获取有关GPU处理渲染所花费时间的准确时序信息。
在“微基准渲染上了PowerVR SERIES5,Series5XT和系列6 GPU的”岗上畅想博客解释了写性能测试这样的最佳实践。
| 归档时间: |
|
| 查看次数: |
2216 次 |
| 最近记录: |