【Unity入門】UpdateとFixedUpdateとLateUpdateの違い

初心者のウチに何か勘違いしたり、よくわからないまま使ってしまうのが、UpdateとFixedUpdateとLateUpdateです。ではこれらの違いはなんなのかというのを解説していきたいと思います。

<フレームについて>

Updateは毎フレーム呼ばれる処理ですが、まずはフレームって何なの?という話をします。

ゲームにおけるフレームというのは、計算して画面に描画する一連の流れの事を言います。

様々な計算を行う

様々な計算を元に画像を作り出す

画面に描画する

この一連の流れを1フレームと言います。

よく言うFPSと言うのは、フレームパーセカンドの略なので、1秒間にこの一連の処理を何回できるかと言う意味になります。

30FPSなら1秒間の間に↑の一連の流れを30回行なっている事になります。

では30FPSは1/ 30 = 0.0333333….. だから1フレーム0.0333333….秒なのかーと思ってしまいます。これは、合ってはいるんですが、ちょっと勘違いしている可能性が高い考え方になります。

おそらくなんとなーく無意識のうちに平均化して考えている方が多いのではないでしょうか?

例えば1フレーム0.0333333….秒で考えた時

様々な計算を行う(0.0111111…. 秒)

様々な計算を元に画像を作り出す(0.0111111…. 秒)

画面に描画する(0.0111111…. 秒)

みたいな。↑のように無意識のウチに平均化して考えていらっしゃる方もいるのではないでしょうか。さらにずっと一定なイメージがある方もいらっしゃると思います。一定でないとFPSが乱れて画面がカクカクになりますし。

しかし、実際はどうなるかと言うと

様々な計算を行う(0.0△△△…. 秒(何秒か不明、毎回変わる))

様々な計算を元に画像を作り出す(0.0□□□…. 秒(何秒か不明、毎回変わる))

フレーム開始から0.0333333….秒になるように待つ

画面に描画する(全部合わせて0.0333333….秒)

と、こんな感じです。

30FPSの場合、0.0333333….秒になるように待つ事によって一定を保っているわけですね。

ちなみに様々な計算や、様々な計算を元に画像を作り出す作業が間に合わなくて、0.0333333….秒を越えてしまった場合、処理落ちが発生します。

このFPSは基準みたいなものがありまして、60FPS,30FPS,15FPS,0FPSを基準にしています。ディスプレイと同期を取るためにこのような基準にしているみたいです。

FPSが安定しないとガクガクになって見えてしまうので基準を設けてそれに合わせているわけですね。

<UpdateとLateUpdateとFixedUpdateの基礎知識>

とりあえず、いったん整理するため、各種Updateの種類について簡単にまとめてみました。

・Update・・・1フレーム1回呼ばれる
・LateUpdate・・・1フレーム1回呼ばれる。様々な計算の最後に行われる
・FixedUpdate・・・一定間隔で呼ばれる。物理演算の前に呼ばれる。

これだけみて、何だかわかった気にはなりますが、何だかつっかえる物があるひともいるのではないでしょうか。それについて解説していきます。

<UpdateとLateUpdate>

さて、Updateは毎フレーム呼ばれる処理でした。つまり↑の一連の流れの中で毎回呼ばれる事になります。ちなみにLateUpdateというのも毎フレーム呼ばれる処理です。これを↑の中に入れると。

様々な計算を行う

 〜〜様々な計算が行われる〜〜〜
 >Updateが呼ばれる
 〜〜様々な計算が行われる〜〜〜
 >最後にLateUpdateが呼ばれる


様々な計算を元に画像を作り出す

フレーム開始から○○秒(FPSに合わせる)になるように待つ

画面に描画する

となります。

UpdateとLateUpdateは1フレームにつき1回呼ばれるのでわかりやすくていいです。




<FixedUpdate>

FixedUpdateの呼ばれ方

さて、ではFixedUpdateというのは何なのでしょう?何だかよくわからないけどわかった気になってしまうのが、「一定間隔で呼ばれる」←これですよね。

実は一定間隔で呼ばれるというのは一定秒数で呼ばれるわけではありません。

絶賛勘違いポイントです。この勘違いをしている方は多いのではないでしょうか。

↓でFixedUpdateについて検証していますので、もしよかったらみて見てください。

さて、FixedUpdateは何なのかというのを簡潔にしてしまうと、一定間隔であるかのように見えるようにする処理の中の一部です。詳しくは↑の記事を見ていただくとして、まとめると

様々な計算を行う

>FixedUpdateが呼ばれる
>物理演算が行われる

  ↑の処理が一定間隔で呼ばれているかのようにn回ループする(nが0の時もある)

↓ループが終わったら下に進む

 >Updateが呼ばれる
 〜〜様々な計算が行われる〜〜〜
 >最後にLateUpdateが呼ばれる

様々な計算を行う

様々な計算を元に画像を作り出す

フレーム開始から○○秒(FPSに合わせる)になるように待つ

画面に描画する

となります。

この「一定間隔」というのは、ProjectSettings>Time>Fixed Timestepで定義されています。

project settings time

処理がFixed Timestepより速い場合

もし、60FPSだった場合、1フレーム0.016666…秒なのでFixed Timestepの0.02秒より早いので、

 >FixedUpdateが呼ばれる
 >物理演算が行われる

この処理が1フレームの間に行われないタイミングがあります。1フレームの処理速度が物理演算の処理速度より早い為です。nが0の時もあると↑で書いたのはこの為です。

処理がFixed Timestepより遅い場合

もし、30FPSだった場合、1フレーム0.0333333….秒なので、Fixed Timestepの0.02より遅くなります。その為、

 >FixedUpdateが呼ばれる
 >物理演算が行われる

この処理が1フレームの間に2回行われるタイミングがあります。1フレームの処理速度が物理演算の処理速度より遅い為です。

30FPSの処理の例を時系列で書いてみると

Fixed Timestepの0.02で、30FPSで安定している場合

現実時間

0秒

0.02秒

?秒

〜待ち時間〜

0.0333333….秒

0.04秒

0.06秒

?秒

〜待ち時間〜

0.066666….秒

現在のフレーム数

0フレーム

0フレーム

0フレーム

0フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

2フレーム

処理

FixedUpdate

Update、LateUpdate

画面に描画

FixedUpdate

FixedUpdate

Update、LateUpdate

画面に描画

という感じに1フレームの間にFixedUpdateが2回呼ばれているタイミングがある事がわかります。こういったズレがある為、物理計算などはFixedUpdateに書いた方がいいと言われるわけです。

処理がすこぶる重い場合

さて、ここまで見ると、確かに一定秒数で呼ばれています。が、処理が重いとちょっと違う挙動になります。

Fixed Timestepの0.02で、30FPSで処理落ちしている場合、

現実時間

0秒

0.02秒

?秒

0.0333333….秒

?秒

仮に1秒だとする

〜待ち時間〜

1.033333….秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

1.033….??秒

〜待ち時間〜

1.066666….秒

現在のフレーム数

0フレーム

0フレーム

0フレーム

0フレーム

0フレーム

0フレーム

0フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

1フレーム

2フレーム

処理

FixedUpdate

Update、LateUpdate

まだ処理が終わらない

まだ時間がかかる

処理が終わる

画面に描画

FixedUpdateが呼ばれるが一定間隔とズレている

FixedUpdateをできる限り呼び出し無理やり時間を進める

仮に5回呼び出しせたとします。

FixedUpdate

FixedUpdate

FixedUpdate

FixedUpdate

FixedUpdate

現実時間では1秒とちょっと経っていますが、ゲーム内では0.1秒経っている事にします。

Update、LateUpdate

画面に描画

とまぁ、こんな感じで可能な限り帳尻合わせを試みます。無理だったら、どれだけ現実時間が経過していようが、ゲーム内時間は

FixedUpdateが呼ばれた回数 × Fixed Timestep

この秒数経ったものとして扱います。

これはUnityが勝手に作った時間軸なので、実際の現実時間の秒数ではないのです。

<まとめ>

これらUpdate,LateUpdate,FixedUpdateは同じメインスレッドで処理されています。FixedUpdateだけが特殊で、なるべく現実時間に合わせようと努力しますが、無理な時もあります。Unityの時間軸はFixedUpdateが呼ばれるタイミングを基準にしているので、現実の時間とズレた時は独自の時間軸になるので注意してください。

<わからない事、質問等があれば>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば

自分の Youtubeの動画にコメントで質問していただければ動画でお答えしようと思います。

文章同士のやり取りだと伝わりづらいし、ラリーに時間がかかりそうなので動画で回答します。

↓の動画が回答の一例になります。どの動画でもいいのでご遠慮なくコメントしてください

できたらチャンネル登録よろしくお願いします!



タイトルとURLをコピーしました