Feel Physics Backyard

HoloLensの出張授業をする会社で、教材を開発しています

UnityのUpdate()をマネージャで管理して、重くて遅かったアプリを軽く速くする

処置前:

f:id:weed_7777:20170920134522p:plain

処置後:

f:id:weed_7777:20170920134552p:plain

「先輩、Unityアプリが重いんですけど」

「1フレームでUpdate()は何回呼んでる?」

「100回です」

「あー、それはマネージャをつくって管理した方がいいな。やり方を教えよう」

「ありがとうございます!」

UnityのUpdate()のコールは数が多いとアプリの実行の負担になります。そこで、Update()をUpdateManagerで管理してみましょう。プロファイラーを見ると違いがハッキリわかります。

こんな感じで書きます:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UpdateManager : MonoBehaviour
{
    public List<ManagedUpdateBehavior> list = new List<ManagedUpdateBehavior>();

    // Update is called once per frame
    void Update()
    {
        var count = list.Count;
        for (var i = 1; i < count; i++)
        {
            list[i].UpdateMe();
        }
    }
}

アプリ起動時にインスタンスをマネージャのlistプロパティに追加します:

void Start()    
    {
        
        ...

        // Update Managerに自分を登録する
        UpdateManager um = GameObject.Find("UpdateManager").GetComponent<UpdateManager>();
        um.list.Add(this);
    }

するとプロファイラの様子が、こんな感じから…

f:id:weed_7777:20170920134522p:plain

こんな感じに変わります:

f:id:weed_7777:20170920134552p:plain

60FPSが見えてきました!


より詳細はUnity公式の以下の記事が参考になります:

blogs.unity3d.com