Android 测量渲染时间OpenGL ES 2.0
我想使用OpenGL ES 2.0测量各种Android设备上的渲染性能。我通过绘制屏幕大小的(纹理)四边形并绘制N次来实现这一点。基本思想如下所示:Android 测量渲染时间OpenGL ES 2.0,android,performance,opengl-es-2.0,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.currentTimeMill
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;
在这里,您测量下一次调用onDrawFrame(..)开始时的时间,其思想是除非上一次渲染完成,否则不会调用它。但这也导致了同样的问题
还有别的办法吗?或者我应该避免使用这些设备进行性能测量吗?测量GPU性能可能会很棘手。有很多事情你必须考虑,比如图形驱动程序如何解释GLFHUL/GLULL以及VSync将如何影响结果。 在延迟工作的GPU(如PowerVR)上,每帧调用glFinish()永远无法给出性能的真实表示,因为体系结构依赖于并行处理多个帧来实现最佳性能。在执行glFinish()调用的设备上(即CPU线程阻塞直到GPU渲染完成),您的测试将导致渲染序列化,这将导致严重的性能损失。此外,在GPU工作完成之前阻塞CPU线程将引入另一个较大的开销 启用Vsync时,您还将测量GPU等待翻转发生的时间。如果可能,您应该在运行类似这样的性能测试时禁用Vsync,或者在屏幕外渲染(即渲染到FBO),以便避免Vsync限制。或者,您可以使用GPU评测工具(如Imagination)获取处理渲染所用GPU时间的准确计时信息
想象博客上的文章解释了编写这样的性能测试的最佳实践。衡量GPU性能可能很棘手。有很多事情你必须考虑,比如图形驱动程序如何解释GLFHUL/GLULL以及VSync将如何影响结果。 在延迟工作的GPU(如PowerVR)上,每帧调用glFinish()永远无法给出性能的真实表示,因为体系结构依赖于并行处理多个帧来实现最佳性能。在执行glFinish()调用的设备上(即CPU线程阻塞直到GPU渲染完成),您的测试将导致渲染序列化,这将导致严重的性能损失。此外,在GPU工作完成之前阻塞CPU线程将引入另一个较大的开销 启用Vsync时,您还将测量GPU等待翻转发生的时间。如果可能,您应该在运行类似这样的性能测试时禁用Vsync,或者在屏幕外渲染(即渲染到FBO),以便避免Vsync限制。或者,您可以使用GPU评测工具(如Imagination)获取处理渲染所用GPU时间的准确计时信息
想象博客上的文章解释了编写这样的性能测试的最佳实践。你也可以在任何android设备上使用这样的应用程序,并测量FPS。它还检索使用Adreno和IMG GPU的设备的GPU使用情况。该应用程序还收集屏幕截图,以便您了解帧速率下降时发生的情况。您也可以在任何android设备上使用类似的应用程序,并测量FPS。它还检索使用Adreno和IMG GPU的设备的GPU使用情况。该应用程序还收集屏幕截图,以便您了解帧速率下降时发生的情况。谢谢,非常有用的信息。但是,足够高的N是否有助于降低
glFinish()
对性能的影响?我只对单个帧的渲染感兴趣,并了解场景中的某些更改如何影响渲染时间。无论渲染多少帧,glFinish()
,在任何执行调用的设备上都会产生显著的性能影响。延迟GPU一次至少有两个帧在飞行中,例如,在为帧n-1中的片段着色时变换帧n的顶点。通过调用glFinish()
,您将强制GPU串行化它的工作负载,从而降低它的效率。我理解这一点,但在我的概念中,我实际上只有1帧。从来没有一帧等待着另一帧<代码>for(int i=0;iglFinish()
对性能的影响?我只对单个帧的渲染感兴趣,并了解场景中的某些更改如何影响渲染时间。无论渲染多少帧,glFinish()
,在任何执行调用的设备上都会产生显著的性能影响。延迟GPU一次至少有两个帧在飞行中,例如,在为帧n-1中的片段着色时变换帧n的顶点。通过调用glFinish()
,您将强制GPU串行化它的工作负载,从而降低它的效率。我理解这一点,但在我的概念中,我实际上只有1帧。从来没有fra
@Override
public void onDrawFrame(GL10 unused) {
time = System.currentTimeMillis()-start;
//store time somewhere
start = System.currentTimeMillis();
...
//rendering here
...
}