即使激活VSync,我也在寻找一种可移植的方法来制作非阻塞的SwapBuffers()。
换句话说,是否可以通过事件通知或知道延迟到下一个VSync?
答案 0 :(得分:2)
IIRC此扩展有助于:http://www.opengl.org/registry/specs/SGI/video_sync.txt,但目前的驱动程序支持得很差。
答案 1 :(得分:0)
首先,为什么不在帧的开头调用SwapBuffers()?或者以某种方式将管道改为
Render();
Update(); //Update before swapping buffers
SwapBuffers();
虽然OpenGL正在处理您刚刚提交的所有命令,但您可以执行所有更新逻辑。
否则有几种方法可以解决这个问题。
我知道XNA有一个ScanLine属性,告诉你屏幕当前是哪个扫描线。我不知道OpenGL是否暴露了这个,但我很确定它必须。 (右?)
使用多线程渲染。许多现代引擎专门用于渲染整个线程。如果它阻塞,那很好,它不会打扰主线程。或者更简单的方法是在新线程上处理输入等,这避免了图形上下文的复杂化。
使用triple buffering。使用三重缓冲意味着您有2个后缓冲区。在调用SwapBuffers后,屏幕可以继续扫描前缓冲区,新完成的缓冲区等待,第三个缓冲区用于渲染下一帧。当然,如果你已经预渲染了两个帧,SwapBuffers()将会阻塞。