まず、このトピックに関する多くの情報を見つけましたが、残念ながら問題を解決する解決策はありませんでした.
私は単純に、C++ プログラムを 1 秒あたり 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 です。
スリープ機能が予想とは大幅に異なることを行っているかどうかはわかりませんが、その理由はわかりません。それとも、それが時間を取得するための私の方法なのか (時計ではなく世界時間 (ms) である必要があります)サイクルタイム.どんな助けでも大歓迎です, ありがとう.