Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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 GLSurfaceView.Renderer的帧时/帧速率_Android_Opengl Es_Lag_Renderer_Frame Rate - Fatal编程技术网

测量Android GLSurfaceView.Renderer的帧时/帧速率

测量Android GLSurfaceView.Renderer的帧时/帧速率,android,opengl-es,lag,renderer,frame-rate,Android,Opengl Es,Lag,Renderer,Frame Rate,我有一个使用OpenGL ES 2.0的应用程序,并使用GLSURFACHEVIEW和渲染器类绘制到屏幕上。最初,我将rendermode设置为RENDER\u WHEN\u DIRTY,然后每秒调用requestRender()60次,计算完成该函数所需的时间,但当程序明显滞后于我的手机时,我的帧速率一直非常短(高帧速率)。然后,我假设这是因为requestRender()只发布渲染请求,而不是实际调用onDrawFrame(),因此对它进行计时是毫无意义的 然后我决定在实际的onDrawFr

我有一个使用OpenGL ES 2.0的应用程序,并使用GLSURFACHEVIEW和渲染器类绘制到屏幕上。最初,我将rendermode设置为
RENDER\u WHEN\u DIRTY
,然后每秒调用
requestRender()
60次,计算完成该函数所需的时间,但当程序明显滞后于我的手机时,我的帧速率一直非常短(高帧速率)。然后,我假设这是因为
requestRender()
只发布渲染请求,而不是实际调用
onDrawFrame()
,因此对它进行计时是毫无意义的

然后我决定在实际的
onDrawFrame()
函数中进行计时。我在函数的开头和结尾使用了
SystemClock.elapsedRealtime()
,并计算了差异,我的帧率再次超过70,而实际上,我的手机渲染了1000多个顶点,并且非常滞后


那么,您应该如何计算帧时间/帧速率,以及应该在哪些点开始/停止计时?

requestRender()调用进行计时肯定是毫无意义的。您通常在主线程中调用它,它会向渲染线程发出信号,以唤醒并渲染帧。它将在发出信号后立即返回,因此您根本不会测量任何与渲染相关的内容

onDrawFrame()
的开始到结束进行测量更有意义,但它仍然无法提供您所需要的。OpenGL从您在CPU上所做的工作异步运行。在大多数情况下,当您进行OpenGLAPI调用时,它只会将工作排队等待GPU稍后执行。然后,调用会返回,大部分时间是在GPU完成工作之前,或者在驱动程序将工作提交给GPU之前

因此,当您测量
onDrawFrame()
从开始到结束的时间时,您可以测量进行所有OpenGL调用所需的时间,包括在代码中花费的时间,以及驱动程序处理调用所需的时间。但它并不测量GPU完成工作所需的时间

在保持简单的同时,您所能做的最好的事情就是渲染足够多的帧(比如说100到1000帧),并简单地测量从开始到结束所经过的时间。然后将渲染的帧数除以以秒为单位的总运行时间,就得到了总体平均帧率

如果您不仅想要平均帧率,而且还想要观察变化,那么事情就会变得更加困难。如果您需要,我将首先测量从一次调用
onDrawFrame()
开始到下一次调用
onDrawFrame()
开始之间经过的时间。这不是一种科学上精确的方法来测量每一帧的时间,但它会比你尝试的要好得多,至少会给你一些有用的数字。它不准确的原因是,即使是
onDrawFrame()
的开始也不一定与GPU完成帧同步。我相信Android使用了三重缓冲,所以可以有几帧“在飞行中”。换句话说,GPU可以在代码当前正在处理的渲染后1-2帧


OpenGL中有一种称为“计时器查询”的机制,允许您更直接地测量GPU执行给定命令序列所花费的时间。但是该功能直到3.1版才添加到ES中。

非常感谢,这真的很有帮助:D