我想使用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;
实际上,我存储了值并测量了一定数量的渲染过程中的平均值,但这不是问题。这种方法似乎与我的设备(三星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(..)
开始时的时间,并认为除非先前的渲染已完成,否则不会调用它。但这会导致同样的问题。
还有其他方法吗?或者我应该避免使用这些设备进行性能测量?
答案 0 :(得分:5)
测量GPU性能可能很棘手。您需要考虑许多事项,例如图形驱动程序如何解释glFlush / glFinish以及VSync将如何影响结果。
每帧调用glFinish()永远不会真正表示延迟工作的GPU(例如PowerVR)的性能,因为架构依赖于并行处理多个帧以实现最佳性能。在glFinish()调用受到尊重的设备上(即CPU线程阻塞直到GPU渲染完成),您的测试将导致渲染被序列化,这将导致显着的性能损失。此外,阻止CPU线程直到GPU工作完成将引入另一个大的开销。
启用Vsync后,您还将测量GPU等待翻转发生的时间。如果可能,您应该在运行此类性能测试时禁用Vsync,或者在屏幕外渲染(即向FBO),以便您可以避免vsync限制。或者,您可以使用GPU分析工具(例如Imagination的PVRTune)来获取处理渲染所花费的GPU时间的准确时序信息。
Imagination博客上的"Micro-benchmark your render on PowerVR Series5, Series5XT and Series6 GPUs"帖子解释了编写这样的性能测试的最佳实践。
答案 1 :(得分:0)
您还可以使用适用于任何Android设备的GameBench等应用,并测量FPS。它还检索使用Adreno和IMG GPU的设备的GPU使用情况。该应用程序还会收集屏幕截图,以便您了解帧速率下降时发生的情况。