6

我正在寻找一种可移植的方式来制作非阻塞 SwapBuffers() 即使 VSync 被激活。
换句话说,是否有可能被事件通知或知道直到下一个 VSync 的延迟?

4

2 回答 2

2

IIRC 这个扩展有帮助:http ://www.opengl.org/registry/specs/SGI/video_sync.txt ,但是当前驱动程序对它的支持很差。

于 2010-02-08T16:05:13.390 回答
0

首先,为什么不在帧的开头调用 SwapBuffers() 呢?或者以某种方式将管道更改为

  Render();
  Update(); //Update before swapping buffers
  SwapBuffers();

虽然 OpenGL 正在处理您刚刚向它发出的所有命令,但您可以执行所有更新逻辑。

否则有几种方法可以解决这个问题。

我知道 XNA 有一个 ScanLine 属性,它告诉你屏幕当前正在运行哪条扫描线。我不知道OpenGL是否也公开了这一点,但我很确定它必须这样做。(正确的?)

使用多线程渲染。许多现代引擎将整个线程专门用于渲染。如果它阻塞了,那很好,它不会干扰主线程。另一种更简单的方法是在新线程上处理输入等,这避免了图形上下文的复杂性。

使用三重缓冲。使用三重缓冲意味着您有 2 个后台缓冲区。调用 SwapBuffers 后,屏幕可以继续扫描前缓冲区,等待新完成的缓冲区,第三个缓冲区供您渲染下一帧。当然,如果你已经预渲染了两帧,SwapBuffers() 会阻塞。

于 2011-03-21T09:55:23.583 回答