Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 测量渲染时间OpenGL ES 2.0_Android_Performance_Opengl Es 2.0 - Fatal编程技术网

Android 测量渲染时间OpenGL ES 2.0

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

我想使用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;
在这里,您测量下一次调用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;i是模拟一个非常大的场景,屏幕大小是要着色的像素数量的N倍,我希望测量单个帧渲染/完成所需的时间。那么glFinish()仍然是一个大问题吗?因为我没有其他工作。很抱歉,我会将您的答案标记为正确,就像它回答了我的原始问题一样-但我仍然相信glFinish()在这个特定的上下文中就足够了。正如我在原始文章中链接的博客文章中所讨论的,最好的做法是多次重新渲染相同的帧。在基准测试开始时使用时间戳,最后是一个,将经过的时间除以渲染帧的次数,得到平均成本。渲染的重复次数越多,结果就越准确。使用这种方法,不需要使用glFinish(),谢谢,这是非常有用的信息。但是,足够高的N是否有助于降低
glFinish()
对性能的影响?我只对单个帧的渲染感兴趣,并了解场景中的某些更改如何影响渲染时间。无论渲染多少帧,
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
  ...
}