0

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

问题是,在启用 Aero 的 Windows 版本上,输入延迟仍然存在。禁用 Aero 可以解决问题,但我们不想强迫用户这样做。有没有办法阻止 Aero 在我们的应用程序上强制 VSync,或者只为我们的应用程序禁用 Aero?

4

2 回答 2

0

您可以在应用程序运行时使用该DwmEnableComposition功能禁用 Aero。我不确定这是否正是您所说的“仅为我们的应用程序禁用 Aero”的意思。

于 2013-01-11T02:36:52.007 回答
0

Aero 是一个窗口合成系统。合成器本质上会引入渲染延迟,甚至可能长达 2 帧周期。克服这个问题的唯一方法是禁用合成器。


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

这个想法是让合成器收集时间统计信息,合成窗口需要多长时间以及每个程序渲染一帧需要多长时间。然后合成器会给每个程序一个“现在开始渲染”的信号,这样渲染就会在 V-Sync 之前及时完成合成。

不过,到目前为止,我还没有实现这一点。

于 2013-01-11T02:30:15.050 回答