我正在为Windows (XP,Vista,7,8)开发一个有窗口(而不是全屏)的OpenGL应用程序,其中VSync和GPU帧队列会导致非常明显(和糟糕的)输入延迟。我使用了wglSwapBufferEXT来禁用VSync,并在SwapBuffers之后使用了glFinish来防止帧排队。
问题是,在启用了Aero的Windows版本上,输入延迟仍然存在。禁用Aero可以解决这个问题,但我们不想强迫用户这么做。有没有办法防止Aero在我们的应用程序上强制使用VSync,或者只为我们的应用程序禁用Aero?
发布于 2013-01-11 10:30:15
Aero是一个窗口合成系统。合成器本质上引入了渲染延迟,甚至可能有2个帧周期长。克服这个问题的唯一方法就是禁用排序器。
大约两年前,我确实为基于X11合成的系统概述了一个同步方案,其中每个程序将提供关于其渲染时间的“圈速”。基本上,您不能使延迟比渲染帧所需的时间更短。但是,如果您设法将渲染帧的开始延迟到尽可能长的时间,那么集成用户输入直到渲染开始时,您将获得尽可能短的延迟。
这个想法是让排序器收集计时统计信息,合成窗口需要多长时间,以及每个程序渲染一个帧需要多长时间。然后合成器会给每个程序一个“立即开始渲染”的信号,这样渲染就会在V-Sync之前及时完成合成。
不过,到目前为止,我还没有实现这一点。
发布于 2013-01-11 10:36:52
您可以在应用程序运行时使用DwmEnableComposition函数禁用Aero。我不确定这是否是你所说的“仅为我们的应用程序禁用Aero”的意思。
https://stackoverflow.com/questions/14270174
复制相似问题