Unityでよく利用するUpdateに関するメモです。
Unity4.18f1を使っています
Updateってなにさ
主にUnityEngine.MonoBehaviour.Update()のこと。
公式のスクリプトリファレンスによると
UpdateはMonoBefaviourが有効の場合に、毎フレーム呼び出されます
[MonoBefaviour.Update() – Unityスクリプトリファレンス]
ということらしい。英語の部分も適当に訳すと
Update()は記述しなくてもよく、Befaviour(この場合Befaviourを継承しているMonoBefaviourを継承する、スクリプト自体のこと)を有効にした時のみ呼ばれる。前に呼ばれた時からの経過時間はTime.deltaTimeで得ることができる。
Update()は毎フレーム呼ばれる
そう、毎フレーム呼ばれる。
昨今のゲームは大方24~120fpsで処理されている。
・・・ということは、1秒間に24~120回もUpdate()が呼び出されることになる。
この頻度で呼び出される処理が重いと、1秒間に24~120回も呼び出すことすら困難になり、fpsを維持することが難しくなる。
これは注意すべき点である。
試しに負荷テストをしてみる。
まず新規作成したプロジェクトにCubeを追加する。
Gameタブの右上Statsを押すことでStatisticsを表示させる。
すると、Graphics:の横にfpsを表示させることができる。
この状態で実行してみると、
[85.8fps]
90fps前後となる。初期設定だとディスプレイ(というよりGPU?)のリフレッシュレートにUnityが併せるようになっているので環境に依ると思われる。
続いて、
using UnityEngine; public class HeavyProcess : MonoBehaviour { [Header("負荷回数")] [SerializeField] int processCount = 100; void Update () { for(var i=0; i < processCount; i++) { Debug.Log(i +"回目"); } } }
上記のような負荷スクリプトを作成し、Cubeにアタッチする。
この状態でそのまま実行すると、
[17.2fps]
大体25fps前後となる。processCountの値を増やすことで負荷を増やすことができるので値を変化させてfpsの変化を調べることができる。
環境によって数値は変わるため、重要なのは数値自体ではなく
「負荷が大きいUpdateを呼ぶとfpsに影響がある」
ということである。
毎フレーム呼ばれるメソッドには、
重い処理をさせるのは控えよう。