What is it, naokirin?

Unityでスクリプトの一部分の処理をProfilerに表示してもらう

今日は非常に初歩的なTips的な話です。
Unityのドキュメントをちゃんと読んでれば知ってるくらいの知識、ということで。

Unityでゲームを開発していると(というよりはゲームを開発しているとよくあるとは思うのですが)、どうもダメージを食らったときにもっさりしているから軽くしよう、とかいう話が上がったりします。 このときにProfilerやスクリプトにログを埋め込んだりであれやこれやと調べたりするわけですが、Profiler上で表示される粒度が大きすぎて結局どこが問題か調べきれないといったことがあります。 この際に、Unityには便利な機能として、Profiler.BegineSample()/EndSample()があります。

実際にこれらを使うとどのようになるかです。

まずはこのようなサンプルスクリプトを用意しました。

using UnityEngine;
using System.Collections.Generic;

public class ProfilerControl : MonoBehaviour
{
    void Start()
    {
        Profiler.BeginSample("Heavy Process 1");
        HeavyProcess1();
        Profiler.EndSample();
        
        Profiler.BeginSample("Heavy Process 2");
        HeavyProcess2();
        Profiler.EndSample();
    }

    void HeavyProcess1()
    {
        var list = new List<int>();
        for (var i = 0; i < 2000000; ++i)
        {
            list.Add(i);
        }
    }

    void HeavyProcess2()
    {
        var list = new List<int>();
        for (var i = 0; i < 1000000; ++i)
        {
            list.Add(i);
        }
    }
}

Profilerに表示してほしい処理の前後を Profiler.BeginSample/EndSample で囲んでいます。 こうすることで以下のようにProfiler上で表示されるようになります。 f:id:naokirin:20160111024539p:plain

実際に開発中にこのような調査が必要になる箇所は、たいてい複雑で調査しにくい部分であることが多いため、このようなProfiler上で部分ごとに調査できるようになるのは非常に便利です。 プロファイリング回りでUnityで調べる際は、まずはとりあえず以下のページを参考にするとよさそうです。(ちなみに、今回の記事のこともこのページで一応触れられています。)

docs.unity3d.com