gpt4 book ai didi

android - 测量 Android GLSurfaceView.Renderer 的帧时间/帧率

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:14 25 4
gpt4 key购买 nike

我有一个使用 OpenGL ES 2.0 的应用程序,并使用 GLSurfaceView 和 Renderer 类绘制到屏幕上。最初,我将 rendermode 设置为 RENDER_WHEN_DIRTY,然后每秒调用 requestRender() 60 次,计算完成该功能所需的时间,但我一直变得难以置信短帧时间(高帧率),当程序在我的手机上明显滞​​后时。然后我假设这是因为 requestRender() 只发布了一个渲染请求,而不是实际调用 onDrawFrame(),所以计时是没有意义的。

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

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

最佳答案

定时调用 requestRender() 当然是没有意义的。您通常在主线程中调用它,它会通知渲染线程唤醒并渲染一帧。它会在发出信号后立即返回,因此您根本不会测量任何与渲染相关的内容。

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

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

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

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

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

关于android - 测量 Android GLSurfaceView.Renderer 的帧时间/帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com