空闲后的窗口化 OpenGL 第一帧延迟

windowed OpenGL first frame delay after idle

我有窗口化 WinApi/OpenGL 应用程序。在 WM_PAINT 中很少绘制场景(与游戏相比),主要由用户输入触发 - MW_MOUSEMOVE/clicks 等

我注意到,当用户鼠标(应用程序 "idle")没有移动场景,然后用户开始一些鼠标操作时,第一帧的绘制有令人不快的延迟——比如 300 毫秒。后续帧再次变快。

我实现了 100 ms 计时器,它只执行 InvalidateRect,随后是 WM_PAINT/draw 场景。这就是"fixed"的问题。但我不喜欢这个解决方案。

我想知道为什么会发生这种情况以及一些解决方法。 OpenGL渲染上下文在不使用时是否节省资源?或者这可能是由某些系统行为引起的,例如处理器 underclocking/energy 保存等? (尽管我注意到即使应用程序低于 "load",处理器也会以低频运行)

这听起来像是 Windows 虚拟内存系统在工作。所有活动程序的所有内存使用总和通常大于系统上安装的物理内存量。因此 windows 根据其遵循的任何规则将空闲进程换出到磁盘,例如每个进程的相对优先级和空闲时间。

您通过人为地使程序每 100 毫秒激活一次来防止换出(和延迟)。

如果换出的进程被重新激活,从光盘中检索内存内容并重新启动进程需要一点时间。

OpenGL 不太可能造成此延迟。

您可以通过启动具有更高优先级的程序来改善这种情况。 https://superuser.com/questions/699651/start-process-in-high-priority

您还可以使用 virtuallock 函数来防止 Windows 换出部分内存,但不建议这样做,除非您真的知道自己在做什么! https://msdn.microsoft.com/en-us/library/windows/desktop/aa366895(v=vs.85).aspx

编辑:您可以通过添加更多内存来改善性能,而且对于现代 PC 来说 4GB 听起来确实很低,尤其是当您 Chrome 打开多个选项卡时.

如果您想在花费任何辛苦赚来的现金之前保持科学:-),请打开性能管理器并查看缓存 Faults/Sec。这将在您的计算机上显示交换 activity。 (我的电脑上有 16GB,所以这个数字大部分都很低)。为了确保您学习,我会在内存升级前后检查缓存 Faults/Sec - 这样您就可以量化差异!

最后,您已经找到的解决方案没有任何问题 - 每 100 毫秒左右启动一次图形应用程序......

问题出在 NVidia 驱动程序全局 3d 设置中 -"Power management mode"。 选项 "Optimal Power" 和 "Adaptive" 节省电量并导致问题。 只有 "Prefer Maximum Performance" 做了正确的事。