一日一コード 24.ネタはあるのに進まない。

今回は正確にfpsを刻むためのコード。
理論的にはすぐに考えつくのだが、実際に計測する部分がうまくいかず、かなり苦戦。
今回の見所はなんと言っても小数点以下の処理を分数を使ってお手軽簡単にやっているということだ。
ただし、少し、手で計算するところがあるのでfpsをあらかじめ決めておかないといけないが。

簡略版


//FPSカウンタ 60Hz
const int framePerSecond = 60;//目標
int wait = 1000 / framePerSecond;//1回の処理時間。
Bunsu waitHasu;
waitHasu.bunbo= 3; waitHasu.bunsi = 2;// 1回の待ち時間の小数点以下。 16.666 = 16 + 2/3

this->start = timeGetTime();
DWORD t = this->start - this->last;//描画時間 + コールされるまでの時間。

if( this->count < waitHasu.bunbo)//待ち時間の小数点以下調節
{
if( this->count < waitHasu.bunsi) wait += 1;//17ms 17ms 16ms のようにする。
}else{
this->count = 0;//リセット
}

if( t < wait ) //もし処理が16ms より早ければ待つ。
{
Sleep( wait - t -1);// -1 : timeGetTime()とかの微調節。
}else{ //すぐに描画する。
}

//実際に計測。上の待ち時間はここから
this->last = timeGetTime();
DWORD time = this->last - this->test; this->test = this->last;//時間調節ループまで含めた時間。
this->FPS = 1000.0f / time;

//バックバッファに描画***************************************
//実際に表示。バックバッファをプライマリに転送。

return TRUE;
}

今回のソースとか説明とか、というかこっちの説明ページがメインでこのブログは看板みたいなものだ。