ゲームループ
■ゲームループ
ゲームはゲーム内容を画面に表示するために一定間隔ごとに
「ゲーム処理」と「描画処理」を行っています。
この一定間隔の「ゲーム処理」と「描画処理」を繰り返すことを
ゲームループと呼びます。
①.初期化
DirectXやDxLib、OpenGLなどのゲームを開始する上で必要な
初期化処理を実行します。
②.ゲームループ
ゲームループはゲームが終了するまで繰り返されます。
2-1.ゲーム処理
ゲーム処理はその名前の通り、プレイヤーや敵、UIやエフェクトなど
ゲームを動かすためのオブジェクトに対する処理を行います。
2-2.描画処理
描画処理は「ゲーム処理」の結果を画面に反映するための処理です。
③.終了
ゲームを終了したので、①で作成したライブラリなどの解放処理を行います。
●FPS(Frames Per Second)
FPSとは1秒間に何回フレーム処理(ゲーム処理と描画処理)を行うかを表した単位のことです。
例えば60FPSでは1秒間に60回フレーム処理(ゲーム処理と描画処理)を実行します。
・フレーム
フレームとはゲームループの繰り返し回数に使用する単位です。
1フレーム中に「ゲーム処理」「描画処理」を1回ずつ実行します。
・処理時間制御
FPSを実現するためには一定間隔で処理を実行できるように
処理時間を制御する必要があります。
例:
60FPS => 1フレームを約0.016秒(16ms)間隔で実行
30FPS => 1フレームを約0.032秒(32ms)間隔で実行
1フレームで行う処理がきっちりFPSの間隔にあわせて終わることはありません。
早く終わった場合は次のフレームの開始時間になるまで処理を停止させます。
もし時間がかかりすぎた場合、「処理落ち」と呼ばれる現象が発生します。
これを回避するために「フレームスキップ」や処理の内容を見直し、
速度向上を実現する必要があります。
・処理落ち
処理落ちとは1フレーム内でかかった処理時間がFPSの処理周期時間を
超えてしまった際に発生する現象です。
主な現象:
ゲーム画面の止まる
処理の遅延が発生するので描画の更新が遅れ、画面が一瞬止まります。
発生頻度が高いとコマ送りで動いているようになります。
時間の誤差
時間計測は処理的コストが高いとされているので、
ゲームではよくフレーム数で時間を計ります。
処理落ちが発生すると処理落ちの頻度の分タイマーとしての
精度が落ちることになります。
・フレームスキップ
フレームスキップとは処理落ちが発生した際の対応策です。
内容は時間をオーバーした分の調整として本来の時間に戻るまで
ゲーム処理だけを行い描画処理は実行を行わないというものです。
描画処理が停止するので画面の内容がいきなりスキップします。
メリット:
・時間の誤差が少なくなる
周期時間を越えた分の調整を行うので
フレーム数で計測の誤差が少なくなります。
デメリット:
・画面の内容が間引きされる
フレームスキップを行ったフレームだけ、
描画処理がなくなるので、画面に反映される内容が
本来の内容と比べて間引きされたものになります。
フレームスキップはあくまで処理落ちが発生した際の対応策なので
処理落ちの原因となる箇所の見直しの必要はあります。
また、メリットとデメリットがあるので、それを考慮したうえで
使用するかどうかを決めてください。