호우동의 개발일지

Today :

article thumbnail

프로파일러

  • 유니티 엔진에서 제공해 주는 유니티에서 개발하고 있는 앱을 분석할 수 있는 툴
  • 매 프레임마다 구체적인 퍼포먼스를 분석할 수 있음
  • 게임의 최적화를 위해 사용

프로파일러 위치1
프로파일러 위치
프로파일러 위치

  • 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);
            }
        }
    }
}
  • 프로파일러를 관찰파란색 선이 치솟는 것을 확인할 수 있음 → 퍼포먼스를 많이 잡아먹는 것을 확인

 

  • 특정 지점을 클릭하면 해당 프레임이 분석 가능
    • 해당 프레임이 구체적으로 어떻게 퍼포먼스를 사용하고 있는지에 대해 분석
    • 특정 지점 마우스 클릭 → 클릭을 하면 게임은 일시정지 상태로 변함
      Test.update 분석
      Test.Update()를 분석할 수 있다.
  • PlayerLoop가 퍼포먼스의 7.9%로 증가하였고 그중 3.5%가 Update문에서 나왔음을 확인
    • 이는 Test 스크립트의 Update문에서 나왔음을 확인
      • RotateAround() 함수를 호출했음을 알 수 있다.

 

 

 

퍼포먼스 스파크 현상

  • 퍼포먼스 스파크 현상을 발생시키는 트리거 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 , 오브젝트 형)은 힙 영역에 할당됨
  • 가비지 컬렉터가 메모리 영역에 있는 참조형 변수를 한 번에 수거할 때 발생하는 퍼포먼스를 스파크라고 함
    • 가비지 컬렉터가 수거하는 시점은 사용자가 알 수 없다.

 

 

 

결론

  • 가비지 컬렉터의 컬렉팅 작업은 긴 시간을 요구할 수 있음
    → 퍼포먼스 스파크 현상을 줄여야 함 → 할당을 최대한 덜 하자