C编程、win32、游戏、Sleep()花费的时间比预期的要长

C编程、win32、游戏、Sleep()花费的时间比预期的要长,c,winapi,sleep,frame-rate,C,Winapi,Sleep,Frame Rate,这是一个非常奇怪的问题,让我发疯 我使用Sleep()函数来设置游戏帧速率,我只是执行游戏循环,然后在结束时等待几毫秒,以调整到每帧16.6毫秒。为此,我创建了自己的等待函数(多平台,但问题只发生在WIN32上): //等待几毫秒(停止程序执行) 静态无效等待(浮动毫秒) { //#定义使用\u忙\u等待\u循环 #如果已定义(使用\u忙\u等待\u循环) double-prevTime=GetTime(); 双nextTime=0.0; //忙等待循环 而((nextTime-prevTime

这是一个非常奇怪的问题,让我发疯

我使用Sleep()函数来设置游戏帧速率,我只是执行游戏循环,然后在结束时等待几毫秒,以调整到每帧16.6毫秒。为此,我创建了自己的等待函数(多平台,但问题只发生在WIN32上):

//等待几毫秒(停止程序执行)
静态无效等待(浮动毫秒)
{
//#定义使用\u忙\u等待\u循环
#如果已定义(使用\u忙\u等待\u循环)
double-prevTime=GetTime();
双nextTime=0.0;
//忙等待循环
而((nextTime-prevTime)
为了避免包含windows.h,我将Sleep()函数定义为:

#如果已定义(_WIN32)
void uu stdcall Sleep(无符号长msTimeout);
#恩迪夫
问题:当我使用MinGW32(GCC 5.3.0)编译这段代码时,似乎Sleep()比传递给函数的毫秒长(几乎是两倍),当我使用MSVC(Visual Studio Community 2015)编译时,有时工作正常,有时不正常。最奇怪的是,当它工作时,如果我执行以前不工作的MinGW32版本。。。然后他们工作正常!疯狂的

根据我的理解,这个问题应该与一些运行时库的使用有关,取决于操作系统(在Windows1064bit上尝试)。注意,当工作正常时,如果探索进程,dwm.exe将控制第二个线程(等待链)——不确定它的含义——当失败时,该进程不可用

仅供参考,以防我遗漏了一些细节,这就是我使用Wait()的函数:

//端部框架图
空心端框(空心)
{
SwapBuffers();//将后缓冲区复制到前缓冲区
PollInputEvents();//轮询用户事件
//帧时控制系统
currentTime=GetTime();
drawTime=当前时间-上一次时间;
previousTime=当前时间;
帧时间=更新时间+绘图时间;
//等几毫秒。。。
如果(帧时间<目标时间)
{
等待((目标时间-帧时间)*1000.0f);
currentTime=GetTime();
double extraTime=currentTime-previousTime;
previousTime=当前时间;
帧时间+=额外时间;
}
}

MS Sleep()的粒度与您使用的时间间隔的顺序相同:(你可以试试多媒体定时器。你应该看看这个:非常感谢你的回答!考虑到今天的计算机速度,我无法想象如此大的粒度…@Ray Windows是一个面向人类用户的桌面操作系统,已经有很长的使用寿命。运行在5MHz 8088上的Windows 3.1实际上无法流式传输视频或提供高framerate gaming。在这类机器上选择了Sleep()滴答时间间隔,向后兼容性和惯性问题意味着系统调用不应随着时间的推移而显著偏离。相反,随着硬件速度的提高和YouTube/Netflix/任何可能的应用,增加了附加功能(例如多媒体计时器)。