我似乎无法理解帧绘制如何与缓冲区交换同步。
问题如下:
1.由于大多数打开的 GL 调用都是非阻塞(或缓冲)的,您如何知道 gpu 是否已完成当前帧?
2.open GL 是否处理它以便未完成的帧不会交换到窗口缓冲区
3.如何计算帧率?我的意思是确定绘制的帧数或每帧花费的时间的依据是什么?
最佳答案
与 GL 同步的现代方法是使用 sync objects .使用 glFinish()
(或其他阻塞式 GL 调用)的缺点是会同时拖延 GPU 和 CPU(线程):CPU 将等待 GPU 完成,然后 GPU 会拖延,因为有没有新工作排队。如果同步对象使用得当,两者都可以完全避免。
您只需在您感兴趣的任何时间点将 fence sync 插入到 GL 命令流中,稍后可以检查是否完成之前的所有命令,或者您可以等待完成(同时你仍然可以有更多的命令排队。
请注意,对于帧速率估计,您不需要任何明确的同步方法。只需使用 SwapBuffers()
就足够了。 gpu 可能会提前排队几帧(nvidia 驱动程序甚至为此设置),但这不会干扰 fps 计数,因为只有前 n 帧排队。只需计算每秒发出的 SwapBuffer()
调用次数,就可以了。如果用户开启了sync to vblank,帧率会限制在显示器的刷新率,不会出现撕裂现象。
如果您需要更详细的 GPU 计时统计信息(但对于帧速率计数器,您不需要),您应该查看 timer queries .
关于java - openGL 中的帧速率和绘制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647285/