スクリプトのプロファイラー調査

2022年9月26日

Unityでは、どの処理にどれくらい時間がかかっているかを調べるツールが備わっています
Profilerを使い、様々な調査をしてボトルネックになっているところを調べてみましょう

今回はそのうちの1つ、スクリプトが処理にどれくらい営業しているかを調べてみます

環境

Mac Studio 2022 (Apple M1 Max) 32GB

チップセットの機種: Apple M1 Max

  • 機種名: Mac Studio
    機種ID: Mac13,1
    チップ: Apple M1 Max
    コアの総数: 10(パフォーマンス: 8、効率性: 2)
    メモリ: 32 GB
  • 種類: GPU
    バス: 内蔵
    コアの総数: 24
    製造元: Apple(0x106b)
    Metalファミリー: 対応、Metal GPUFamily Apple 7

Unity

  • 2022.1.17f1

シーンの構築

DebugSampleとしてプロジェクトを作成しましょう
1つのゲームオブジェクト、1つのスクリプトで構成します

Profilerツールの起動方法

Windowメニューから起動します

テストコード

調査にため、高負荷がかかる処理のコードを作成します

using UnityEngine;
using UnityEngine.Profiling;

public class ProfileTest : MonoBehaviour
{
    Renderer rendrer;

    private void Start()
    {
        rendrer = GetComponent<Renderer>();
    }

    void Update()
    {
        Profiler.BeginSample("LoadTest");

        for (int i = 0; i < 100000; i++)
        {
            // ここに負荷のかかるコードを記述してテストします
        }

        Profiler.EndSample();
    }
}

コードの説明

プロファイリングの時に目印としてコメントを追加したいので、名前空間を追加します

using UnityEngine.Profiling;

コンポーネントを取得して、フィールド変数に代入しています
コンポーネントが変化しないため、先にキャッシュしています

Renderer rendrer;

private void Start()
{
    rendrer = GetComponent<Renderer>();
}

このスクリプト内でどこからどこまでを計測範囲とするかを指定しています
LoadTest(翻訳:負荷テスト)のところは自由に変更できます

Profiler.BeginSample("LoadTest");
// この間のコードの実行時間を計測
Profiler.EndSample();

// ここに負荷のかかるコードを記述してテストします に記述するテスト

負荷のかかる処理の場合

GetComponnetメソッドは、Updateで都度呼び出さないのがセオリーと言われていますが、それのテストをします
次のコードでは、Startメソッドで一旦代入されているフィールドに再代入(上書き)しています
なのでStartのrendrerの値は無効になります

rendrer = GetComponent<Renderer>();

結果

Cube1つだけですが、すでに60fpsより速くはならないようです
15msくらいかかっています

負荷のかからない処理の場合

Componentの取得はStartで行い、Updateでは、このキャッシュされた内容を代入しています

Renderer getRendrer = rendrer;

結果

200fps以上でています
0.12msくらいに収まっています

参考)Debug.Logメソッドの場合

Debug.Logの負荷は高いですが、実際にどれくらいか見てみましょう

Debug.Log("Test");

結果

ほとんど、ハングアップ状態です
3.2秒かかっていますので明らかにコマ落ちしています(厳密には描画するできていません)

詳細を確認

全体の94%を処理に使っているのがわかります

Unity,デバッグ

Posted by hidepon