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