프로파일러
- 유니티 엔진에서 제공해 주는 유니티에서 개발하고 있는 앱을 분석할 수 있는 툴
- 매 프레임마다 구체적인 퍼포먼스를 분석할 수 있음
- 게임의 최적화를 위해 사용
- Deep Profile을 통해 정밀 분석 가능
- 어떤 모드로 분석을 하는 것은 자유지만 필자는 Hierarchy로 보는 게 편해서 해당 모드로 분석
- 해당 상태에서 게임을 시작하면 분석 차트가 흘러나옴.
Hierarchy
EditorLoop
: 에디터 상에서만 사용되는 퍼포먼스- 최적화 측면에서는 전혀 고려하지 않아도 됨
PlayerLoop
: 프로그래머가 직접 조작하는 부분들- 최적화 측면에서 고려해야 하는 부분
- 해당 부분을 분석해야 함
프로파일러 분석하는 법
- 오브젝트를 회전시키는 스크립트가 아래처럼 존재한다.
- 해당 스크립트는 Update 함수에서 호출한다.
Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
public bool rotate;
private void Awake()
{
rotate = false;
}
// Update is called once per frame
void Update()
{
if (rotate)
{
Transform[] items = gameObject.GetComponentsInChildren<Transform>();
foreach(var item in items)
{
item.RotateAround(Vector3.zero, Vector3.forward, 1);
}
}
}
}
- 프로파일러를 관찰파란색 선이 치솟는 것을 확인할 수 있음 → 퍼포먼스를 많이 잡아먹는 것을 확인
- 특정 지점을 클릭하면 해당 프레임이 분석 가능
- 해당 프레임이 구체적으로 어떻게 퍼포먼스를 사용하고 있는지에 대해 분석
- 특정 지점 마우스 클릭 → 클릭을 하면 게임은 일시정지 상태로 변함
- PlayerLoop가 퍼포먼스의 7.9%로 증가하였고 그중 3.5%가 Update문에서 나왔음을 확인
- 이는 Test 스크립트의 Update문에서 나왔음을 확인
- RotateAround() 함수를 호출했음을 알 수 있다.
- 이는 Test 스크립트의 Update문에서 나왔음을 확인
퍼포먼스 스파크 현상
- 퍼포먼스 스파크 현상을 발생시키는 트리거 Assign String을 true
- 중간중간에 퍼포먼스가 비정상적으로 튀어 오르는 현상
해당 스크립트
public class Test : MonoBehaviour
{
public bool assignString;
private void Awake()
{
assignString = false;
}
// Update is called once per frame
void Update()
{
if (assignString)
{
string str = "";
for (int i = 0; i < 100; i++) str += "abcd";
}
}
}
발생 이유
- 기본적으로 C#은 가비지 컬렉터(Carbage Collector)에 의해 힙(heap) 영역에 있는 메모리들은 수거가 됨
- 지역 변수들은 가비지 컬렉터가 아닌 시스템에 의해 수거됨
- 지역 변수들은 가비지 컬렉터가 아닌 시스템에 의해 수거됨
- 주소 체계를 사용하는 참조형(String , 오브젝트 형)은 힙 영역에 할당됨
- 가비지 컬렉터가 메모리 영역에 있는 참조형 변수를 한 번에 수거할 때 발생하는 퍼포먼스를 스파크라고 함
- 가비지 컬렉터가 수거하는 시점은 사용자가 알 수 없다.
결론
- 가비지 컬렉터의 컬렉팅 작업은 긴 시간을 요구할 수 있음
→ 퍼포먼스 스파크 현상을 줄여야 함 → 할당을 최대한 덜 하자