首先,我发现了很多与此主题相关的信息,但不幸的是,没有找到解决该问题的解决方案。

我只是试图将我的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),它将计时器硬件重新编程为每毫秒触发一次(大约)一次。

10-08 02:41