Windows 中有很多应用程序以相当高且稳定的帧速率触发代码而不会占用 CPU 的示例。
例如,WPF/Silverlight/WinRT 应用程序可以做到这一点。浏览器和媒体播放器也可以。他们究竟是如何做到这一点的,我将进行哪些 API 调用以从 Win32 应用程序中实现相同的效果?
当然,时钟轮询不起作用,因为这会使 CPU 达到峰值。也不是Sleep()
,因为您最多只能获得大约 50 毫秒的粒度。
他们正在使用多媒体计时器。您可以在此处找到有关 MSDN的信息
在每个多媒体计时器事件中,只有视图无效(使用InvalidateRect )。绘图发生在WM_PAINT
/OnPaint
处理程序中。
其实睡觉也没什么不好。
您可以使用 QueryPerformanceCounter/QueryPerformanceFrequency 的组合来获得非常准确的计时,并且平均而言,您可以创建一个循环,该循环平均在预期的时间准确地向前滴答。
我从来没有见过一个睡眠会错过它的最后期限多达 50 毫秒,但是,我见过很多天真的计时器会漂移。即accumalte一个小的延迟和conincedentally更新明显的不规则间隔。这就是导致帧率不均匀的原因。
如果您在每 n:th 帧播放一个非常短的哔声,这非常可听。
此外,逻辑和渲染可以彼此独立运行。CPU 可能看起来没那么忙,但我敢打赌 GPU 工作很努力。
现在,关于不占用 CPU。CPU 使用率只是给定样本下进程所花费的 CPU 时间的细分(线程调度程序实际上会跟踪这一点)。如果您的游戏目标为 30 Hz。你被限制在每帧 33 毫秒,否则你会落后(CPU 太慢或代码太慢),如果你不能达到这个目标,你将不会以 30 Hz 运行,如果你在 33 毫秒以下达到它然后您可以释放处理器时间,从而有效地释放资源。
这对你来说可能也是一本有趣的读物。
在旁注中,您可以有效地为未来的计算做准备工作,而不是让出时间。一些游戏在负载不重的情况下实际上会做一些事情,比如排序和内存碎片整理,到处都是,最后加起来。