C++ 奇怪';睡眠';系统间行为

C++ 奇怪';睡眠';系统间行为,c++,winapi,timing,C++,Winapi,Timing,我有一个程序,它使用SleepWin32 API调用使线程等待特定的时间量。 简而言之,它通过发送内存中预取的图像来模拟相机。我正在使用Sleep模拟帧速率--睡眠(1000/fps) 这在我的开发系统(英特尔i5(第1代),Win7 64)中运行良好,但当我在另一个系统(英特尔i7-2600-SandyBridge)上运行它时,睡眠时间完全不同且不准确 比如说,, 睡眠(16)睡眠时间约为32ms 睡眠(3)睡眠时间16ms 在过去,我认为windows中的最小睡眠时间为15ms,但我的开发系

我有一个程序,它使用
Sleep
Win32 API调用使线程等待特定的时间量。
简而言之,它通过发送内存中预取的图像来模拟相机。我正在使用
Sleep
模拟帧速率--
睡眠(1000/fps)

这在我的开发系统(英特尔i5(第1代),Win7 64)中运行良好,但当我在另一个系统(英特尔i7-2600-SandyBridge)上运行它时,睡眠时间完全不同且不准确

比如说,,
睡眠(16)
睡眠时间约为
32ms

睡眠(3)
睡眠时间
16ms

在过去,我认为windows中的最小睡眠时间为
15ms
,但我的开发系统没有这个限制

有什么想法吗


此外,是否有更好的方法来实现我的模拟器的帧速率?

睡眠功能保证您将睡眠至少达到调用中指定的数量。它导致线程挂起,允许在调度程序空闲时切换到其他线程(由线程优先级控制)。换句话说,睡眠线程不能保证在指定时间过后立即运行,因此在一般情况下应避免使用
睡眠
进行精确计时

不过,有一些方法可以在Windows上实现更精确的睡眠。您可以调用
timeGetDevCaps
来确定支持的最小计时器分辨率,然后在应用程序的早期调用
timeBeginPeriod
一次,将计时器分辨率设置为其最小值。请确保在应用程序退出之前调用
timeEndPeriod


有关更多信息,请参见。

不要依赖不准确的睡眠行为或特定于平台的计时器功能(我不知道这些功能可能工作得很好),您可以像游戏循环一样构建它

在循环中,您调用一个函数来提供当前时间。您可以计算自绘制最后一帧以来经过了多长时间,并决定何时在正确的时间自己渲染下一帧。在开发过程中,您应该测量每秒的实际帧数并显示它

使用这种方法,tt更容易使代码跨平台且更准确。此外,您的循环处于控制之中,而不是将代码构造为您可能也更喜欢的计时器回调

缺点是“繁忙等待”循环意味着您的进程将一直不必要地使用CPU。为了缓解这种情况,您可以通过以某种方式显式地泵送用户界面事件,或者使用更短的睡眠时间,从而在循环中产生CPU:-)

如果你想了解更多关于这种方法的信息,那么就开始在谷歌上搜索游戏循环的资料

以下是一些重要链接:

并就此进行了讨论:


您所说的是Win32函数还是C函数(请注意“s”的大小写)?您的描述暗示了第一个,您的拼写/命名和(相当一般的)标记在另一个。@Christian.K--Win32
Sleep
我尝试运行
timeBeginPeriod
,但它对持续时间没有影响。您确定它成功了吗,即返回了
TIMERR\u NOERROR