在Windows的游戏循环中使用Sleep()是否安全?


27

在Windows游戏循环(C ++)中使用Sleep()函数是否安全?我想要固定的帧速率。


您需要弄清楚“安全”是什么意思。当然,它是安全的,不会损坏内存或炸毁播放器PC。
Kromster说支持Monica

Answers:


32

不,这不对。睡眠仅保证了最短的睡眠时间,但实际上可能会在该时间上任意任意时间睡眠。计时器分辨率(通过timeBeginPeriod设置)对此也很重要,即使您使用其他计时器(例如QueryPerformanceCounter)作为计时器,您仍然需要timeBeginPeriod来控制睡眠。

因此,总而言之:

  • 睡眠时间只是保证的最短时间,实际睡眠时间可能会更长。
  • 对通过timeBeginPeriod设置(或未设置)的值敏感。

使用睡眠的唯一合理情况是,如果您想减少例如移动设备的CPU使用率。即使那样,您仍将使用Sleep(1); 用它来控制帧速率不是走的路。

强制启用vsync可能是获得固定帧率的一种常见方法,但是即使那样,不同的硬件也将以不同的刷新率运行,并且您将无法在不同的机器上获得一致的固定帧率(这取决于哪种硬件)当然是您的目标)。

在这一点上,有必要提到这篇文章:Gaffer On Games-Fix your Timestep!。这描述了在仿真中获得一致的时间步所需的步骤。


非常感谢您的链接。到目前为止,我通常使用本文中介绍的“可变时间步长”方法。
伊凡·武西卡(IvanVučica)2011年

在启用了Intel Speed-step的计算机上,睡眠也很危险。
waterwizard11 2011年

“但是它实际上可能在那段时间内任意睡眠。” 好吧,我想必须证明这一点……从来没有见过任何证明,所以我想它就是那些“定义”之一。好的答案是的,是的,您不能(即使它是准确的)使用任何类型的Sleep来设置固定帧率(可以,但是您需要一个高精度计时器来做到这一点)。
Valmond 2011年

2
每个MSDN-“请注意,不能保证就绪线程可以立即运行。因此,线程可能要等到睡眠间隔过后的一段时间才能运行”。没错,我从未见过它发生,但是同时,如果有记录表明它是可能的,我绝对不会依赖它永远不会发生。
Maximus Minimus

1
值得一提的是,我认为这与“ ...如果要减少CPU使用率...” 有关:nanobit.net/doxy/quake3/win__main_8c-source.html <-相关代码始于01224
user_123abc

16

简短的回答:不,不是。

要获得固定的帧速率,您必须调用强制特定帧速率的特定回调函数。显然,如果您现在不知道循环中的单个迭代将花费多长时间,则无法设置固定的睡眠时间。

GLUT提供了glutTimerFunc(),如果您正在OpenGL中编程,则它是您所需的正确函数。看看这个例子,或者一个。


1
至少毫秒后,OpenGLUT会调用回调”-与Sleep有何不同?
Kromster说支持Monica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.