ゲームやグラフィックプログラミングの話題では、良く「フレームレート」という言葉が出て来ます。これは、簡単に言うと一秒間に何回描画されたか、という数字です。例えば、あるビットマップを加工しながら描画する場合、一秒間に100回描画されたなら「フレームレート100」となるわけです。 フレームレートの測定フェードイン・フェードアウトでは、描画の「周期」を指定していました。つまり、一定時間毎に描画していたわけです。 一方、フレームレートというのは簡単に言えば「周期」の逆数の事ですから、周期を指定するのではなく周期(というか前回の処理からの経過時間)を測定すればフレームレートが求まる事になりますね。 フェードイン・フェードアウトの時には、 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フレーム程度でしたが、この数値は環境によって変わってくるはずです。 |