我正在为Windows(XP,Vista,7、8)开发一个窗口化(非全屏)OpenGL应用程序,其中VSync和GPU帧排队会导致非常明显的(并且很糟糕的)输入滞后。我已经使用wglSwapBufferEXT禁用了VSync,并在SwapBuffers之后使用了glFinish来防止帧排队。

问题是,在启用了Aero的Windows版本上,输入滞后仍然存在。禁用Aero可以解决此问题,但是我们不想强迫我们的用户这样做。有没有一种方法可以防止Aero在我们的应用程序上强制执行VSync,或者仅对我们的应用程序禁用Aero?

最佳答案

Aero是一个窗户合成系统。合成器就其本质而言会引入渲染滞后,甚至可能长达2个帧周期。克服此问题的唯一方法是禁用合成器。



大约两年前,我确实概述了基于X11 Composite的系统的同步方案,其中每个程序都会提供有关其渲染时间的“圈数”。基本上,延迟不会比渲染帧所需的时间短。但是,如果您设法尽可能长时间地延迟渲染帧的开始,那么将用户输入整合到渲染的最开始,您将获得尽可能短的延迟。

想法是让合成器收集时序统计信息,合成窗口所需的时间以及每个程序渲染帧所需的时间。然后,合成器将向每个程序发出“立即开始渲染”信号,以便渲染将在V同步之前及时完成以进行合成。

到目前为止,我尚未实现此功能。

关于c - 在Aero Window中禁用VSync,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14270174/

10-10 16:54