カラーテーブル変更とフレームレート測定

ゲームやグラフィックプログラミングの話題では、良く「フレームレート」という言葉が出て来ます。これは、簡単に言うと一秒間に何回描画されたか、という数字です。例えば、あるビットマップを加工しながら描画する場合、一秒間に100回描画されたなら「フレームレート100」となるわけです。
フレームレートは、グラフィック処理アルゴリズムの効率やグラフィック描画能力の目安として使われ、ベンチマークやDirectX などのサンプルプログラムでも重視されていますね。自分でプログラムを作る時にも、フレームレートを測定できれば処理を効率化していく時にかなり有力な目安になるでしょう。

フレームレートの測定

フェードイン・フェードアウトでは、描画の「周期」を指定していました。つまり、一定時間毎に描画していたわけです。

一方、フレームレートというのは簡単に言えば「周期」の逆数の事ですから、周期を指定するのではなく周期(というか前回の処理からの経過時間)を測定すればフレームレートが求まる事になりますね。

フェードイン・フェードアウトの時には、

  if (GetTickCount()<tm+20)
	tm=GetTickCount();
  else /* 前回の処理から20ms 以上経ってなければ戻る */
	return;

として、前回の処理から一定時間が経っていなければ処理をしないようにしていましたが、今回は前回の処理をしてから経過した時間を計りましょう。

  dwPreTime=dwTime;

  if (GetTickCount()>dwTime+1)
	dwTime=GetTickCount();
  else /* 前回の処理から1ms 以上経ってなければ戻る */
	return;

  dwCount=dwTime-dwPreTime; /* 前回からの経過時間を記録 */

この例では最低の周期を1ms にしていますが、こうしないと数字がおかしくなるようです。これで、dwCount に前回の処理からの経過時間が記録されるので、後は描画の時に経過時間からフレームレートを求め(1000/dwCount)表示します。

  wsprintf(lpStr,"FrameRate=%3d",(DWORD)(1000/dwCount));
  TextOut(hdc,32,264,lpStr,lstrlen(lpStr));

プログラム

今回のプログラムは、カラーテーブルを書き換えながらDIBを描画するプログラムです。前回はカラーテーブルの配列を作ってその配列をカラーテーブルのアドレスにコピーしましたが、今回は紫のスケールで作ったカラーテーブルの緑成分を直接書き換えています。

プログラムソース表示

私のマシンでは大体100フレーム程度でしたが、この数値は環境によって変わってくるはずです。


プログラミング資料庫 > DIB/Waveによる音声画像処理実験室