无阻塞SwapBuffers()与VSync = on

问题描述:

我正在寻找一种可移植的方式来创建一个无阻塞的SwapBuffers(),即使VSync被激活。
换句话说,是否可以通过事件来通知,或知道延迟到下一个VSync?无阻塞SwapBuffers()与VSync = on

+0

如果可能的话,这将是平台特定的。所以请至少指定您的平台。 – unwind 2010-02-08 15:49:47

+0

我想找一种实现此功能的便携式方式(Win32/Linux/MacOSX) – 2010-02-08 15:55:48

+0

延迟到下一个vsync如何帮助您?这并不像swapbuffer调用在调用时进行交换。 – Bahbar 2010-02-08 17:54:47

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

+0

不幸的是,你是对的,这个功能支持非常差。 – 2010-02-09 16:27:58

首先,你为什么不在框架的开头调用SwapBuffers()?或以某种方式将管道改为

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

虽然OpenGL的是在你只是把它的命令在外打工,你可以做所有的更新逻辑的。

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

我知道XNA有一个ScanLine属性,它告诉你屏幕当前正在使用哪条扫描线。我不知道OpenGL是否也暴露了这一点,但我确定它必须。 (对吧?)

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

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