【发布时间】:2015-08-03 17:26:11
【问题描述】:
我正在尝试开发一些延迟非常低的图形应用程序,但我对通过 OpenGL 绘制到屏幕所需的时间感到非常沮丧。我在网上找到的关于它的每一个讨论都针对优化 OpenGL 管道,但没有得到任何接近我需要的结果。
看看这个:
https://www.dropbox.com/s/dbz4bq67cxluhs7/MouseLatency.MOV?dl=0
您之前可能已经注意到这一点:使用 c++ OpenGL 应用程序,在屏幕上拖动鼠标,并在 OpenGL 中绘制鼠标位置,OpenGL 会滞后 3 或 4 帧。显然 OSX CAN 以非常低的延迟将 [光标] 绘制到屏幕上,但 OpenGL 慢得多。所以假设我不需要做任何花哨的 OpenGL 渲染。我只是想以某种方式将像素推到屏幕上。有没有办法让我完全绕过 OpenGL 并更快地绘制到屏幕上?或者这种功能是否会被锁定在内核中我无法访问的某个地方?
【问题讨论】:
-
尝试提供更多关于你已经尝试过的细节,可能是你实现的一些代码示例
-
可能想要阅读this buffer object streaming article。我推测完全绕过opengl的方式将涉及依赖于硬件的API。
-
在 OSX El Capitan 下,可以使用带有像素着色器的简单 4 顶点着色器使用 Metal 从帧缓冲区中进行绘制。见例子objc.io/issues/18-games/metal
-
我浏览了缓冲区流式传输文章,但无法得到它的帮助。我可以看到使用它来查看改进的唯一方法是,如果我能够以某种方式直接访问 openGL 后绘制的内存并在 openGL 管道之外重绘到它。但我不认为这是我正在寻找的解决方案......
-
当我关闭垂直同步时,突然间我的延迟基本上降到了零。也许是因为我仍在等待缓冲区翻转 3 或 4 次,但是在关闭 vsync 的情况下,这种情况每 3 毫秒而不是每 16 毫秒发生一次?
标签: c++ macos opengl draw low-latency