유니티 / / 2026. 5. 21. 11:11

게임 최적화(1) - Unity Profiler 읽는 법!

안녕하세요, 규니티입니다!

최적화 특집 시리즈 1편입니다. 오늘 주제는 Profiler 읽는 법이에요.

Profiler 는 프레임당 성능 지표를 캡처하여 병목 현상을 파악하는 데 도움을 줍니다. 프로파일러에 포함된 모듈을 사용하여 CPU 사용량, GPU, 렌더링, 메모리, 물리 등의 세부 정보를 상세하게 확인할 수 있습니다.

최적화를 처음 시작할 때 가장 많이 하는 실수가 "느린 것 같은 곳"을 감으로 건드리는 거예요. 근데 대부분 범인은 예상 못한 곳에 있어요. 저도 렌더링 문제인 줄 알고 한참 씨름했는데 알고 보니 GC Alloc이 원인이었던 적이 있었거든요.

그래서 최적화보다 Profiler 읽는 법이 먼저입니다!
GC Alloc : 프로그램이 실행되는 동안 관리 힙(Managed Heap) 메모리에 새로 할당된 메모리 용량(바이트)

 

 


1. 그 전에, FPS보다 ms를 봐야 하는 이유

Profiler 열기 전에 하나만 짚고 넘어갈게요.

보통 "60fps 나오면 되는 거 아니야?" 싶지만, 개발자 입장에선 fps보다 밀리초(ms) 단위로 보는 게 훨씬 중요해요.

예를 들어 게임이 0.75초 동안 59프레임을 멀쩡하게 그리다가, 딱 한 프레임만 0.25초가 걸렸다고 해볼게요. 평균 내면 60fps인데, 그 한 프레임에서 플레이어는 끊김을 느낍니다.

fps는 이런 순간적인 스파이크를 숨겨버려요. 그래서 Profiler에서는 프레임당 ms로 판단해야 해요.

목표 fps에 따른 프레임 예산은 이렇습니다.

  • 30fps → 프레임당 33.33ms 이하
  • 60fps → 프레임당 16.66ms 이하

이 예산을 단 한 프레임이라도 넘으면 플레이어가 알아챕니다. 모바일은 더 빡센데, 발열과 배터리 때문에 실제 목표는 예산의 65% 수준으로 잡는 게 좋아요. 30fps 기준이면 22ms, 60fps 기준이면 11ms가 현실적인 목표예요.


2. Profiler 여는 법

Window → Analysis → Profiler

열고 나서 Play 버튼 누르면 실시간으로 데이터가 쌓이기 시작해요. 상단에 탭이 여러 개 있는데 오늘은 자주 쓰는 세 개만 다뤄보겠습니다!

  • CPU Usage
  • Memory
  • Rendering

3. 병목이 CPU인지 GPU인지 먼저 파악하기

본격적으로 탭을 보기 전에, 방향부터 잡아야 해요

CPU 바운드란 CPU에서 처리할 게 너무 많은 상황이에요. 스크립트, 물리, 애니메이션 같은 것들이 주범이고, 이 경우엔 GPU 설정을 아무리 건드려도 프레임이 안 올라요.

GPU 바운드란 GPU 렌더링이 너무 오래 걸리는 상황이에요. 이 경우엔 코드 최적화보다 셰이더, 해상도, 드로우 콜 쪽을 봐야 해요.

 

Unity에서는 Profiler 창 상단에 Highlights 모듈이 있습니다! 타겟 프레임 시간을 설정하면 CPU랑 GPU 중 어디가 문제인지 바로 알려줘서 시작점 잡기가 훨씬 편해졌습니다.


4. CPU Usage — 어디서 시간을 가장 많이 쓰나

제일 먼저 봐야 하는 탭이에요.

그래프에서 프레임을 하나 클릭하면 아래에 해당 프레임에서 실행된 함수들이 계층 구조로 나와요. 여기서 봐야 할 컬럼은 두 가지입니다.

  • Total(%) : 전체 프레임 시간 중 이 함수가 차지하는 비율
  • GC Alloc : 이 함수에서 힙 메모리에 새로 할당된 양

GC Alloc이 매 프레임 0B 면 이상적인 상태예요. 숫자가 계속 찍히고 있으면 어딘가에서 불필요한 할당이 일어나고 있다는 신호입니다.

특히 Update() 안에서 GC Alloc이 나오고 있으면 바로 의심해야 해요.

보기 방식도 두 가지예요.

  • Hierarchy 뷰 : 함수별로 정렬된 목록. GC Alloc 컬럼 클릭하면 많이 할당되는 함수 순서로 정렬돼요.
  • Timeline 뷰 : 시간 흐름대로 시각화된 뷰. 분홍색/마젠타색으로 표시된 부분이 GC 할당이 일어나는 지점이에요. 보이면 바로 의심하세요.
 
 
 

5. Memory — 메모리가 어떻게 쌓이나

Memory 탭에서는 게임이 현재 얼마나 메모리를 쓰고 있는지 볼 수 있어요.

여기서 주로 보는 항목이에요.

  • Total Used Memory : 현재 총 메모리 사용량
  • Texture Memory : 텍스처가 차지하는 메모리. 아틀라스 적용 전후로 비교해보면 차이가 바로 보여요
  • GC Allocated In Frame : 이 수치가 빨간 선으로 스파이크 치는 프레임이 있으면 그 프레임을 집중 분석해야 해요

메모리 탭은 실시간 성능보다는 누수 탐지 쪽에 더 유용해요. 게임 플레이 중에 이 수치가 계속 우상향한다면 어딘가에서 메모리가 제대로 해제되지 않고 있다는 신호입니다.

오브젝트 단위로 뜯어보고 싶으면 Memory Profiler 패키지를 따로 설치해야 해요. Package Manager에서 "Memory Profiler" 검색하면 나와요. 씬 언로드 전후 스냅샷을 비교해서 누수를 잡는 데 아주 유용합니다.


6. Rendering — Draw Call이 얼마나 나오나

Rendering 탭에서는 렌더링 관련 수치를 볼 수 있어요.

여기서 봐야 할 핵심 수치는 두 가지입니다.

  • Batches : 실제로 GPU에 넘어간 드로우 콜 횟수. 낮을수록 좋아요
  • SetPass Calls : 렌더링 상태가 바뀐 횟수. Batches보다 이 수치가 더 중요할 때도 있어요

모바일 기준으로 Batches가 200을 넘기 시작하면 렌더링 병목을 의심해볼 만해요. 다음 편에서 다룰 Batching이랑 아틀라스가 이 수치를 낮추는 핵심 방법입니다.

 


5. Profiler Workflow

이건 유니티에서 제공하는 Profiler Workflow입니다!

 
 
 

프로파일링의 핵심은 최적화의 대상이 되는 병목 현상을 식별하는 것입니다!
추측에만 의존하게 된다면 게임의 일부분만 최적화하게 되어 성능이 개선되지 않을 수도 있습니다. 심지어 원래 의도와 달리 게임의 전체적인 성능에 악영향을 끼칠 수도 있습니다.

이 플로 차트를 보고 실제로 원인을 빠르게 파악하여 투입한 시간 대비 최대한의 효과가 나타나도록 최적화해보세요!


마무리

Profiler는 처음엔 뭔가 많아 보여서 겁먹기 쉬운데, 사실 보는 탭이 정해져 있어요. CPU Usage에서 GC Alloc 확인하고, Memory에서 누수 체크하고, Rendering에서 Batches 확인하는 것. 이 세 가지만 익혀도 웬만한 병목은 잡을 수 있어요.

다음 편은 Rendering 탭에서 자주 보이는 Draw Call을 실제로 줄이는 방법입니다. Batching이랑 아틀라스를 한 번에 정리할게요.

그리고 제가 이번 글을 작성하면서 참고한 유니티 가이드북입니다! 다들 한 번씩 보는걸 추천 드립니다
https://unity.com/kr/resources/ultimate-guide-to-profiling-unity-games-unity-6

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유