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
?