首先,我发现了很多与此主题相关的信息,但不幸的是,没有找到解决该问题的解决方案。
我只是试图将我的C++程序调节为每秒60次迭代。我已经尝试了从GetClockTicks()到GetLocalTime()的所有内容,以帮助进行调节,但是每当我在Windows Server 2008计算机上运行程序时,它的运行速度都比本地计算机慢,因此我不知道为什么!
我了解基于“时钟”的函数调用会返回执行所花费的CPU时间,因此我转到GetLocalTime,然后尝试区分开始时间和停止时间,然后调用Sleep((FPS/1000)-millisecondExecutionTime)
我的本地计算机比服务器的CPU速度要快得多,因此很明显地以为它摆脱了CPU的滴答声,但这并不能解释为什么GetLocalTime不起作用。我一直基于http://www.lazyfoo.net/SDL_tutorials/lesson14/index.php来更改此get_ticks()方法,并使用了我可以在网上找到的所有返回函数。
例如,使用以下代码:
#include <Windows.h>
#include <time.h>
#include <string>
#include <iostream>
using namespace std;
int main() {
int tFps = 60;
int counter = 0;
SYSTEMTIME gStart, gEnd, start_time, end_time;
GetLocalTime( &gStart );
bool done = false;
while(!done) {
GetLocalTime( &start_time );
Sleep(10);
counter++;
GetLocalTime( &end_time );
int startTimeMilli = (start_time.wSecond * 1000 + start_time.wMilliseconds);
int endTimeMilli = (end_time.wSecond * 1000 + end_time.wMilliseconds);
int time_to_sleep = (1000 / tFps) - (endTimeMilli - startTimeMilli);
if (counter > 240)
done = true;
if (time_to_sleep > 0)
Sleep(time_to_sleep);
}
GetLocalTime( &gEnd );
cout << "Total Time: " << (gEnd.wSecond*1000 + gEnd.wMilliseconds) - (gStart.wSecond*1000 + gStart.wMilliseconds) << endl;
cin.get();
}
对于此代码段,在我的计算机(3.06 GHz)上运行,我得到的总时间(ms)为3856,而在我的服务器(2.53 GHz)上,我得到的总时间为6256。因此,尽管比率为2.53,但它可能是处理器的速度/3.06只有.826797386,而3856/6271是.614893956。
我看不出“ sleep ”功能是否做得比预期的要大得多,尽管我不知道为什么会这么做,还是我的获取时间的方法(即使它应该是世界时间(毫秒)而不是时钟)谢谢您,我们将不胜感激。
最佳答案
一方面,Sleep的默认分辨率是计算机的配额长度-通常为10ms或15ms,具体取决于Windows版本。要获得1ms的分辨率,您必须发出timeBeginPeriod(1),它将计时器硬件重新编程为每毫秒触发一次(大约)一次。