Unity Profiler

Stats面板

  • Render thread 渲染线程,渲染一帧需要多少ms
  • Batches 批次,需要分几个批次提交给GPU
  • Saved by batching 有多少物体是同一批次提交给GPU(合批数量)
  • Tris: 三角形数(面数)
  • Verts:顶点数
  • Screen:屏幕分辨率大小,越大内存消耗越高
  • SetPassCalls 一次完整的渲染流程切换Shader的次数
  • Shadow casters 阴影开销
  • Visible skinned meshes: 可见骨骼meshs数量,可见蒙皮骨骼

Profiler

Up主讲解
Profiler(Standalone Process) 单独开启一个线程进行分析,对现有游戏影响较小

使用一个循环来伪造有问题的代码

using System.Collections;
using System.Collections.Generic;
using System.Text;
using Unity.Profiling;
using UnityEngine;
using UnityEngine.Profiling;

public class ProfilerTest : MonoBehaviour
{
    // Start is called before the first frame update
    private int _loopCount = 50000;
    private StringBuilder _stringBuilder = new StringBuilder();
    void Start()
    {
        ProfilerMarker test1 = new ProfilerMarker("Test1");
        test1.Begin();
        //test1
        for (int i = 0; i < _loopCount; i++)
        {
            Debug.Log(i+"Test");
        }
        test1.End();
        //
        Profiler.BeginSample("TTT");
        Profiler.EndSample();
        //test2
        StartCoroutine(DelayShowLoop());
    }

    // Update is called once per frame
    void Update()
    {
       
    }

    IEnumerator DelayShowLoop()
    {
       for(int i = 0; i < 100000; i++)
        {
            yield return new WaitForFixedUpdate();
            _stringBuilder.Clear();
            _stringBuilder.Append(i);
            Debug.Log($"{_stringBuilder}");
        }
    }
}

  • 通过Hierarchy面板可以观察到在游戏开始的时候 Scripts处于异常状态,因为在一帧内做了50000次循环
  • 通过ProfilerMarkerBeginEnd 来定位有问题的代码开销
  • 在Profiler Start看到自定义的ProfilerMarker Test1占用了87.2%的开销,其中最耗内存的是 LogStringToConsole
  • 在协程中的打印看到几乎没有什么波动

真机调试定位

  • 通过打出Debug包进行观察,在莫个时候非常卡的时候,可以快速定位或者录制
  • 一般定位出某一时间段波动幅度非常到,如果是Script颜色占比非常高,大概率是莫个方法性能开销
  • 如果是Rendering 则要考虑,同屏渲染是否开销过大,或者某个物体定点面数是否过于精细