少々変更しました。
Sleep関数は正確にその時間待機するわけではないという事がわかりましたので、
この誤差はSleep関数の待機時間誤差によるものであると推測しました。
そこで、Sleep関数で待機する時間を1ミリ秒減らし、
後はwhile文で待機する事にしました。
void wait_fanc(){//60fps以上にならないようにする関数
//static unsigned int wt,cnt=0,wwt=0;
LONGLONG miri_wait=0,micro_wait=0,wait=0,wait2=0,start=0;
static LONGLONG before_time=0;
static int cnt=0;
if(cnt!=0){//最初はbefore_timeに値が入っていないので飛ばす
//まずSleep関数の誤差を踏まえて16666-1000の15666μ秒待機したい。
//待機すべき時間=15666-(かかった時間)により
//waitに待機したい時間を格納する。
wait=15666-(GetNowHiPerformanceCount()-before_time);
if(wait>0){//待機すべき時間があれば
//15666マイクロ秒の、まず15ミリ秒になるまでSleepする。
miri_wait=wait/1000;
Sleep(miri_wait);
}
//次の正確な待機はwhileで行う。
//待機すべき時間=15666-(かかった時間)により
//wait2にマイクロ秒待機したい時間を格納する。
wait2=16666-(GetNowHiPerformanceCount()-before_time);
if(wait2>0){
micro_wait=wait2;
start=GetNowHiPerformanceCount();
while(GetNowHiPerformanceCount()-start<micro_wait);
}
//結局1周にかかった時間をfps_waitに格納する。16666が入る事を期待する。
//fps_waitはunsigned intのグローバス変数
fps_wait=(unsigned int)(GetNowHiPerformanceCount()-before_time);
if(cnt%60==0)
printfDx("wait=%lld,wait2=%lld,miri_wait=%lld,micro_wait=%lld,fps_wait=%d\n"
,wait,wait2,miri_wait,micro_wait,fps_wait);
}
before_time=GetNowHiPerformanceCount();
cnt++;
return;
}
先ほど同様結果はこちらです。
wait=7537, wait2=976, miri_wait=7, micro_wait=976, fps_wait=16727
wait=13401,wait2=1666,miri_wait=13,micro_wait=1666,fps_wait=16743
wait=4586, wait2=781, miri_wait=4, micro_wait=781, fps_wait=16736
wait=9907, wait2=1191,miri_wait=9, micro_wait=1191,fps_wait=16728
wait=3158, wait2=517, miri_wait=3, micro_wait=517, fps_wait=16742
wait=9613, wait2=860, miri_wait=9, micro_wait=860, fps_wait=16739
wait=2272, wait2=521, miri_wait=2, micro_wait=521, fps_wait=16720
wait=8207, wait2=1025,miri_wait=8, micro_wait=1025,fps_wait=16733
wait=2854, wait2=1071,miri_wait=2, micro_wait=1071,fps_wait=16712
wait=9711, wait2=1623,miri_wait=9, micro_wait=1623,fps_wait=16715
wait=2575, wait2=1411,miri_wait=2, micro_wait=1411,fps_wait=16717
wait=8357, wait2=964, miri_wait=8, micro_wait=964, fps_wait=16740
wait=14376,wait2=1545,miri_wait=14,micro_wait=1545,fps_wait=16721
wait=6968, wait2=1385,miri_wait=6, micro_wait=1385,fps_wait=16731
wait=12970,wait2=1298,miri_wait=12,micro_wait=1298,fps_wait=16741
wait=5650, wait2=930, miri_wait=5, micro_wait=930, fps_wait=16730
wait=12063,wait2=1094,miri_wait=12,micro_wait=1094,fps_wait=16746
wait=3089, wait2=570, miri_wait=3, micro_wait=570, fps_wait=16710
wait=7657, wait2=1674,miri_wait=7, micro_wait=1674,fps_wait=16723
wait=12558,wait2=1155,miri_wait=12,micro_wait=1155,fps_wait=16729
先ほどより幾分よくなりました。
fps_waitの値は16666に近づいたものの、やはりまだ16666とは違います。
FPSも59.7FPS位になり、ピッタリ60FPSになりません。
windowsで計る時間はあてにならないと聞いたことがありますが、
正確な測定は無理なのでしょうか?