発掘の趣旨
timeGetTime -tsg.ne.jp
が数多くリンクされているにも関わらずDeadLinkになっている
21 May 2001 - 24 Sep 2009
まで存在していたようだ。
2001年ごろはゲームにもms単位の精度はさほど要求されていなかったことがわかる。
timeGetTimeの使い方
まずmmsystem.hをインクルード。 そしてwinmm.libとリンクする。
Windowsが起動してからの時間をミリ秒単位で返す。 Win9xではこの関数の標準の精度は1ms。 しかしNTでは標準では5ms以上。 timeBeginPeriod とtimeEndPeriodを使って精度を決める。
timeBeginPeriod( 1 );//精度を1msに設定
//timeGetTimeを使う
timeEndPeriod( 1 );//timeBeginPeriodで指定した値を渡す
Win9xで作った物をそのままWinNTで動かそうとするとおかしくなる。
GetTickCountとの精度比べはしたことはないけれど、 マルチメディアタイマーというからには、 timeGetTimeのほうがいいのでは、と思う。
These multimedia timer services allow you to schedule timer events at a higher resolution than other timer services.
こんなこともSDKドキュメントに書いてあるし。
60fpsの測り方
こんな感じで測るといいらしい。
DWORD dwLastFlipped;//前回の時間
DWORD dwErrorValue;//誤差値
void doWait(){
DWORD dw,dw2;
while( 50 > (dw2 = ((dw = timeGetTime()) - dwLastFlipped) * 3 + dwErrorValue ) ){
Sleep( 1 );
}
dwLastFlipped = dw;
dwErrorValue = dw2 % 50;
}
Pentium2 300MHzのマシンで1000万回呼んだ時、GetTickCountは650ms、timeGetTimeは3800ms程度掛かった。 GetTickCountより重いとはいえ問題にならない程度だと思う。
QueryPerformanceCounterというのもあるらしい。 根拠は無いが、ゲームに使う分にはtimeGetTimeで十分ではないだろうか。
NVIDIAに Timer Function Performanceというツールがあった