メインループでのウェイト
前回の日記(1/4)でメインループの事を述べましたが、ループにて繰り返しを行う際に、ウェイト処理を入れてやる必要があります。
このウェイト処理というのは、ゲームに対するCPUのパワーが余れば余るほど必要になる処理で、これを行わないとゲームのスピードがとんでもなく速くなってしまう現象が発生します。
最近では当てはまらなくなってきましたが、少し前まではTVのブラウン管の映像表示(走査)速度と同じ、60fps(1秒間に60コマ = 60フレーム)で、タイミングを取るというのが当たり前という感じでゲームのプログラミングを行うというのが定石で、間に合わなければ30fpsに低下…というような処理をメインループに入れるということを行っていることが一般的のようです。
私もJavaで2Dゲームを開発したときは、同様なことを行い、
long m_nowTime; while(true) { // 入力処理、タスク、描画、サウンド等の処理 // 処理した時間を計算して、ウエイトが必要か判断します |
のようなコーディングを行いました。ここの「m_framerate = 17」というのが、1秒間のうちの60コマのおおよその1コマ秒となり、1÷60=0.016666… = 約0.017秒 = 17ミリ秒となります。
(Javaのスレッドを停止させるThread.sleepメソッドの単位はミリ秒となります)
ただし、このようなコーディングの場合は、処理落ちが発生した場合は全体がスローモーションとなり、フレームのスキップなどが行えないので、フレームスキップを行う場合には、描画処理を数フレーム行わない等の高度なウェイトを更に検討しなければなりません。
XNAの場合は非常にインテリジェンスなフレームワークを実装しており、メインループの実装も不要、フレームレートもMicrosoft.Xna.Framework.Gameインスタンス内のIsFixedTimeStep、TargetElapsedTimeにて、可変/固定フレームレート、フレームレートのタイミングを設定することができます。
(殆ど何も考えずに、メインループの実装が行われている&フレームスキップの実装が容易となります)
| HOME |