こんにちは。少し日が空いてしまい申し訳ございません。
本日はゲームの製作によく登場するDeltaTimeとその使い方についてまとめようと思います。
DeltaTimeとは
DeltaTimeとは直前のフレームから現在のフレームまでにかかった経過時間のことです。
タイマーの加算、減算やオブジェクトの移動処理などに頻出し、フレームが変化した際にその結果にズレが発生しないようにするために使用されます。
技術的に述べるのであればフレームレートに依存させたくない処理で使用する値です。
といっても、学生時代に私も上記のように説明されて、理解できなかった記憶があります。
ですので、あえて語弊を気にせず、簡略化してご説明するなら、
どんな状態でも結果が同じになるようにしたい計算で使用する値と私は説明します。
DeltaTimeが必要な状況
DeltaTimeを知る中で、私が個人的に躓いた部分、それが使用するのか、しないのかの判断です。
DeltaTimeは上記に記載した通り、直前のフレームから現在のフレームまでにかかった経過時間であり、どんな状態でも同じ結果が算出されるようにする値です。
つまり、DeltaTimeの中身は常に一定ではなく、状況に応じて可変するのです。
仮にゲームの経過時間を計測するタイマー処理があり、それを100秒間稼働するとしましょう。
まずはdeltaTimeを使わない場合で考えてみます。
float timer = 0.0f;
void Update()
{
timer ++;
}
60FPSなら100秒で6000回Update()が呼ばれ、30FPSなら3000回呼ばれることになります。
つまり、上記の方法だと、何かトラブルや処理落ちでFPSが下がってしまった瞬間に、FPSによって6000や3000など異なる値になってしまうのです。
こういったフレーム数の変化によって結果が変化する処理に対してDeltaTimeが必要になるのです。
では、次にDeltaTimeを用いた処理を見てみましょう。
float timer = 0.0f;
void Update()
{
timer += deltaTime;
}
DeltaTimeは前のフレームから現在のフレームまでに経過した時間を返します。
そのため、FPSが変化するとdeltaTimeの値も変化します。
例えば
30FPSなら約0.0333秒
60FPSなら約0.0167秒
120FPSなら約0.0083秒
を返すわけです。
と言っても、上記の浮動小数点数を見ただけでは分かりづらいと思いますので、計算式にしてみましょう。
各FPSで100秒間ゲームを進めた場合、合計のフレーム数は
30FPS × 100秒 = 3000フレーム
60FPS × 100秒 = 6000フレーム
120FPS × 100秒 = 12000フレーム
になります。
この値に先程の計算結果をかけてみると、下記のようになります。
0.0333 * 3000 = 100秒
0.0167 * 6000 = 100秒
0.0083 * 12000 = 100秒
値が全て同じになったことにお気づきでしょうか。
このように、FPSが変化しても経過時間などの計算結果がほぼ同じになるのがDeltaTimeなのです。
逆に、HPを1減らす、アイテムの所持数を1つ増やす・・といったフレーム単位での変化ではなく、
回数自体に意味がある処理にDeltaTimeは必要無く、deltaTimeを掛けてしまうと値が期待した結果にならないため、注意しましょう。
以上。
本記事は、業務や学習を通して理解した内容を、自分自身の整理も兼ねてまとめたものです。内容に改善点や補足などがありましたら、ご指摘いただけますと幸いです。