java - openGL 中的帧速率和绘制流程

标签 java c++ opengl 3d

我似乎无法理解帧绘制如何与缓冲区交换同步。

问题如下:

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/

相关文章:

c++ - 在 OpenGL 中绘制立方体。迭代更短的代码,但不起作用

c++ - OpenGL 不会改变纹理

java - 使用 jena 保存本体时出错

java - 如何使用java添加迄今为止的天数

java - Java 字符串中的古吉拉特语文本

c++ - 为什么 if 检查没有被优化

c++ - 模板 : Determine template arguments by function prototype

java - 大黄蜂Q : Core API Producer and Asynchronous Consumer problems

c++ - 变量不能出现在常量表达式中

c++ - OpenGL:缓冲到 VBO 后我还需要一个顶点数组吗?