我正在研究用于Windows(XP,Vista,7,8)的窗口(非全屏)OpenGL应用程序,其中VSync和GPU帧排队导致非常明显(和不良)的输入延迟。我已经使用wglSwapBufferEXT来禁用VSync,并在SwapBuffers之后使用glFinish来阻止帧排队。
问题是,在启用Aero的Windows版本中,输入延迟仍然存在。禁用Aero可以解决问题,但我们不希望强制我们的用户这样做。有没有办法阻止Aero在我们的应用程序上强制使用VSync,或者只为我们的应用程序禁用Aero?
答案 0 :(得分:0)
Aero是一个窗口合成系统。合成器本质上引入了渲染延迟,甚至可能是2帧周期。解决这个问题的唯一方法就是禁用合成器。
大约两年前,我确实为基于X11 Composite的系统概述了同步方案,其中每个程序将提供有关其渲染时间的“单圈时间”。基本上你不能让你的滞后时间短于渲染你的帧所需的时间。但是如果你设法尽可能地延迟渲染帧的开始,那么将用户输入集成到渲染的开始就会得到最短的延迟。
这个想法是让合成器收集时序统计信息,合成窗口需要多长时间以及每个程序渲染帧所需的时间。然后合成器会给每个程序一个“立即开始渲染”信号,这样渲染就能及时完成,以便在V-Sync之前进行合成。
到目前为止,我还没有实现这一点。
答案 1 :(得分:0)
您可以使用DwmEnableComposition
功能在应用程序运行时禁用Aero。我不确定这是否与“仅为我们的应用程序禁用Aero”完全相同。