Unity

[Unity] Project Auditor

CCS_Cheese 2025. 12. 13. 17:14

이번 게시글에서는 Unity에서 Project Auditor에 대해서 다루어보겠습니다. 

 

다루게 된 계기

여러 프로젝트를 진행하며, 최적화나 트러블 슈팅에 대한 관심이 많아져있었고, 그러던 중 유니티가 업데이트되면서 제공하는 신규 기능 및 패키지를 찾아보다가 알게 되어 다루게 되었습니다.

 

Project Auditor란?

Project Auditor란 단어별로 해석해 보자면, Proejct(프로젝트) + Auditor(감사자 or 감사관)으로 프로젝트를 점검해 주는 것을 도와주는 기능이라고 이해할 수 있을 거 같습니다. 

 

Project Auditor vs Unity Profiler

Project Auditor Unity Profiler
정적 동적
코드 및 프로젝트 점검 로직, 메모리, 렌더링 프로파일링

 

Project Auditor 적용 절차

  1. New Unity Project : Requirement Editor Version (6.1)
  2. Import Unity Package : Project Auditor
  3. Open Project Auditor Window
    • Path : Windows/Analysis/Project Auditor
  4. Start Analysis 
  5. 프로젝트 점검 

 

프로젝트 생성

Project 생성

패키지 임포트(Project Auditor)

Import Unity Registry Package

Start Analysis

Project 분석 진행

 

프로젝트 점검 결과 레포트(요약)

Project 점검 Summary

프로젝트 점검 시 Code, Asset Shaders, Project, Build 등 프로젝트를 구성하는 카테고리 별로 점검이 가능하고, Asset 파일 또는 Code 단위로 이슈가 발생한 부분에 대한 위험도를 판단하여 이슈 위치를 표기해 줍니다. 이슈 위험도의 분류는 크게는 (Critical, Major, Moderate, Minor, Warning, None)등이 있고 각 등급마다 잠재적인 리스크의 위험도를 판단하는 척도가 됩니다. 

 

몇 가지 Code issues에 대해서 다루어보겠습니다.

Boxing Allocation

Boxing Allocation

int, float 등 값 타입을 object, 특정 class로 변환하게 되면 Boxing이 발생하게 됩니다. 이로 인해 기존 값이, Heap 메모리 영역에 할당되고, 추후에 사용하지 않게 되면 GC(Garbage Collector) 대상이 되어, 불필요한 Boxing이 진행되어 지양하는 것이 좋습니다. 관련 소스를 통해 확인할 수 있습니다.
public string UpdateScoreBoxing()
{
	return string.Format("Score : {0}", score);
}

String Format

흔히 사용하는 String format이 Boxing 이슈가 있습니다. int형을 object 형으로 형변환을 하며, int를 boxing 하고, 사용할 때 string 혹은 int형으로 변환하게 됩니다. 이때 object로 변환하였던 데이터는 사용하지 않으면 GC 대상이 됩니다.

String.Concat 

String Concat allocate

private string StringAppendWithAllocate()
{
	string result = "";
        
	foreach (var tmp in StringList)
	{
		result += tmp;
	}
	return result;
}
String을 연결(Concat)할 때 "가" + "나"를 진행하여, result에 다시 대입할 때 String을 저장하는 저장공간의 재할당이 이루어지게 됩니다. 이로 인해, 기존 "가"가 저장되었던 저장 공간이 GC 대상이 되어 불필요한 관리 대상이 되어 해당 방법은 지양하는 것이 좋습니다. 메모리 관련된 내용은 이미지를 통해 같이 확인이 가능합니다. 

heap에 저장되는 방식

해당 방식으로 String을 연결을 반복하게 되면 계속해서 GC 대상이 되는 Heap영역이 증가하기 때문에, StringBuilder를 활용하여 위 문제점을 해결하는 것이 좋습니다.