我已打开窗口WinApi / OpenGL应用程序。在WM_PAINT中很少(相对于游戏)绘制场景,主要是由用户输入-MW_MOUSEMOVE /点击等触发的。
我注意到,当没有场景通过用户鼠标(应用程序“ idle”)移动,然后用户开始执行某些鼠标操作时,第一帧的绘制就产生了令人讨厌的延迟-例如300 ms。接下来的帧又很快。
我实现了100 ms的计时器,该计时器仅执行InvalidateRect,随后执行WM_PAINT /绘制场景。这“解决”了问题。但是我不喜欢这种解决方案。
我想知道为什么会这样,还有一些解决方法。 OpenGL渲染上下文在不使用时是否节省资源?还是这可能是由某些系统行为引起的,例如处理器超频/节能等? (尽管我注意到即使应用程序处于“加载”状态,处理器也会运行在低频状态)
答案 0 :(得分:0)
这听起来像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时。
如果您想在花掉一些辛苦赚来的现金之前先做好科学工作,请打开Performance Manager并查看“ Cache Faults / Sec”。这将显示您计算机上的交换活动。 (我的PC上有16GB,因此这个数字通常很低)。为了确保您能学到东西,我会在升级内存前后检查“ Cache Faults / Sec”,以便您可以量化差异!
最后,您已经找到的解决方案没有任何问题-每隔100毫秒左右启动图形应用程序.....
答案 1 :(得分:0)
问题出在NVidia驱动程序的全局3d设置-“电源管理模式”中。 选项“最佳功率”和“自适应”可以节省功率并引起问题。 只有“首选最高性能”才能做正确的事情。