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(..)认为除非先前的渲染完成,否则不会调用它。但这会导致同样的问题。

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

4

2 回答 2

6

测量 GPU 性能可能很棘手。您必须考虑许多事情,例如图形驱动程序将如何解释 glFlush/glFinish 以及 VSync 将如何影响结果。

每帧调用 glFinish() 永远不会真正表示延迟工作的 GPU(例如 PowerVR)的性能,因为该架构依赖于并行处理多个帧来实现最佳性能。在支持 glFinish() 调用的设备上(即 CPU 线程阻塞,直到 GPU 渲染完成),您的测试将导致渲染被序列化,这将导致显着的性能损失。此外,在 GPU 工作完成之前阻塞 CPU 线程将引入另一大开销。

启用 Vsync 后,您还将测量 GPU 等待翻转发生的时间。如果可能,您应该在运行此类性能测试时禁用 Vsync 或在屏幕外渲染(即到 FBO),这样您就可以避免 vsync 限制。或者,您可以使用 GPU 分析工具(例如 Imagination 的PVRTune)来获取 GPU 处理渲染所花费的时间的准确时序信息。

Imagination 博客上的“在 PowerVR Series5、Series5XT 和 Series6 GPU 上对渲染进行微基准测试”一文解释了编写此类性能测试的最佳实践

于 2013-06-24T10:45:27.673 回答
0

您还可以使用GameBench等可在任何 Android 设备上运行并测量 FPS 的应用程序。它还检索使用 Adreno 和 IMG GPU 的设备的 GPU 使用情况。该应用程序还收集屏幕截图,以便您了解帧速率下降时发生的情况。

于 2014-06-17T09:57:44.283 回答