Win32游戏循环不会使CPU飙升

时间:2012-04-18 11:30:25

标签: winapi game-loop

Windows中有很多例子可以在相当高且稳定的帧速率下触发代码而不会占用CPU。

例如,WPF / Silverlight / WinRT应用程序可以执行此操作。浏览器和媒体播放器也是如此。他们究竟是如何做到这一点的,以及我将从Win32应用程序中获得相同效果的API调用?

当然,时钟轮询不起作用,因为它会刺激CPU。 Sleep()也没有,因为您最多只能获得大约50毫秒的粒度。

2 个答案:

答案 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也可能是一本有趣的读物。

在旁注中,您可以有效地为未来的计算做预备工作,而不是产生时间。有些游戏在没有负载最重的情况下实际上会做排序和内存碎片整理,最后会有所增加。