测量渲染时间OpenGL ES 2.0

时间:2013-06-23 20:17:19

标签: android performance 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;

实际上,我存储了值并测量了一定数量的渲染过程中的平均值,但这不是问题。这种方法似乎与我的设备(三星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(..)开始时的时间,并认为除非先前的渲染已完成,否则不会调用它。但这会导致同样的问题。

还有其他方法吗?或者我应该避免使用这些设备进行性能测量?

2 个答案:

答案 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使用情况。该应用程序还会收集屏幕截图,以便您了解帧速率下降时发生的情况。