测量渲染时间OpenGL ES 2.0

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的”岗上畅想博客解释了写性能测试这样的最佳实践。