본문으로 건너뛰기

안동민 개발노트

본문 시작

프로파일링 도구 사용법

Unreal Insights·stat 명령·GPU Visualizer·메모리 도구로 프레임과 자원 병목을 측정합니다.

이전 장에서 우리는 멀티플레이어 게임의 네트워킹과 그 최적화 기법에 대해 알아보았습니다.

이제 게임 개발의 또 다른 중요한 측면이자 모든 게임에서 필수적인 부분인 성능 최적화(Performance Optimization)에 대해 다룰 시간입니다.

게임의 성능은 프레임 속도(FPS), 반응성, 로딩 시간 등 플레이어 경험의 모든 측면에 직접적인 영향을 미칩니다.

성능 최적화는 단순히 코드를 빠르게 작성하는 것을 넘어, 게임이 어디에서 병목 현상(Bottleneck)을 겪고 있는지 정확히 파악하는 것이 중요합니다.

이를 위해 언리얼 엔진은 강력한 프로파일링(Profiling) 도구들을 제공합니다.

이번 절에서는 언리얼 엔진에서 제공하는 주요 프로파일링 도구들을 소개하고, 각 도구를 사용하여 CPU, GPU, 메모리 등의 성능 문제를 진단하는 방법에 대해 자세히 알아보겠습니다.

프로파일링 도구 사용법

프로파일링은 프레임 안정성과 입력 반응성을 떨어뜨리는 비용을 측정값으로 분리하는 작업입니다. 먼저 Game Thread, Render Thread, GPU 중 어느 축이 예산을 넘는지 확인합니다.

  1. 스레드별 병목을 좁히는 순서

    같은 맵·카메라·빌드에서 평균과 최악 프레임 시간을 먼저 기록합니다. 2 `stat unit`으로 Game, Draw, GPU 중 예산을 넘긴 축을 고릅니다. 3 CPU는 Unreal Insights, GPU는 GPU Visualizer로 함수·패스까지 좁힙니다. 4 의심 함수·패스·에셋 하나를 바꾸고 같은 조건에서 다시 측정합니다.

  2. 기준선 고정

    같은 맵·카메라·빌드에서 평균과 최악 프레임 시간을 먼저 기록합니다.

  3. 큰 병목 축 분리

    `stat unit`으로 Game, Draw, GPU 중 예산을 넘긴 축을 고릅니다.

  4. 전용 캡처로 확대

    CPU는 Unreal Insights, GPU는 GPU Visualizer로 함수·패스까지 좁힙니다.

  5. 원인 하나만 검증

    의심 함수·패스·에셋 하나를 바꾸고 같은 조건에서 다시 측정합니다.

  6. 프로파일링 측정 축

    Unreal Insights의 Timing View에서 Tick, AI, 물리 호출을 좁힙니다. Insights와 `stat rhi`로 드로우 콜·명령 준비 비용을 확인합니다. `profilegpu`와 GPU Visualizer로 Shadow·Base Pass·Post Process를 분해합니다.


프로파일링이란 무엇인가?

프로파일링은 소프트웨어의 성능을 측정하고 분석하는 과정입니다.

게임 개발에서는 주로 다음을 식별하는 데 사용됩니다.

  • 병목 현상: CPU, GPU, 메모리, I/O 등 특정 자원이 과도하게 사용되어 전체 성능을 저하시키는 지점.
  • 성능 저하의 원인: 특정 시스템(예: 렌더링, 물리, 애니메이션, AI, 네트워크) 또는 특정 에셋(예: 과도한 폴리곤, 큰 텍스처, 최적화되지 않은 머티리얼)이 성능 문제의 주범인지.
  • 최적화 잠재력: 어떤 부분을 개선했을 때 가장 큰 성능 향상을 얻을 수 있는지.

언리얼 엔진은 게임 실행 중에 실시간으로 또는 세션 기록을 통해 상세한 성능 데이터를 수집하고 시각화하는 다양한 내장 도구들을 제공합니다.


주요 프로파일링 도구

언리얼 엔진 5부터는 Unreal Insights가 프로파일링의 주력 도구로 자리 잡았습니다.

기존의 stat 명령어도 여전히 유용하게 사용됩니다.

Unreal Insights (주요 프로파일링 도구)

Unreal Insights는 언리얼 엔진에서 발생하는 다양한 이벤트(CPU 작업, GPU 작업, 메모리 할당, 로깅, 네트워킹 등)를 실시간으로 스트리밍하거나 파일로 기록하여 상세하게 분석할 수 있는 독립 실행형 애플리케이션입니다.

사용 방법
게임 실행 및 데이터 기록
  • 커맨드 라인에서 실행: 엔진 또는 게임 실행 파일에 -trace=[채널1],[채널2],... 옵션을 추가하여 실행합니다.
    • 일반적인 사용: [YourGame.exe] -trace=cpu,gpu,log,frame
    • 모든 채널 기록: [YourGame.exe] -trace=default 또는 -trace=all
    • 프로파일링 활성화: [YourGame.exe] -cpuprofiler -trace=cpu (CPU 프로파일링)
    • 프레임 트레이스 활성화: [YourGame.exe] -frametrace -trace=frame (프레임 단위 디테일 트레이스)
  • 인게임 콘솔 명령: 게임 실행 중 trace start [채널] 또는 trace stop 명령을 사용하여 녹화를 시작/중지할 수 있습니다.
    • trace start cpu,gpu,log
    • trace stop
  • 기록된 .utrace 파일은 [ProjectName]\Saved\Profiling\UnrealInsights\ 또는 [EngineInstallDir]\Engine\Saved\Profiling\UnrealInsights\에 저장됩니다.
Unreal Insights 애플리케이션 실행
  • 언리얼 엔진 설치 디렉토리의 Engine\Binaries\Win64\UnrealInsights.exe를 실행합니다.
  • Unreal Insights가 실행되면, 실시간으로 연결된 세션(Live Session)을 선택하거나, 이전에 저장된 .utrace 파일을 열 수 있습니다 (Open).
Unreal Insights UI 분석
  • Timing View (타이밍 뷰): 가장 중요한 뷰입니다. 시간 경과에 따른 CPU 및 GPU 작업의 상세한 타임라인을 보여줍니다.
    • 각 트랙(스레드, GPU)의 바(Bar)를 클릭하여 해당 작업의 상세 정보를 확인합니다.
    • 줌 인/아웃, 팬(Pan) 기능을 사용하여 특정 프레임이나 구간을 집중적으로 분석합니다.
    • GameThread (게임 스레드): 게임 로직, 액터 업데이트, 물리 등 대부분의 게임플레이 관련 CPU 작업이 여기서 발생합니다.
    • RenderThread (렌더 스레드): 렌더링 명령어 준비 및 GPU로 전송하는 CPU 작업이 여기서 발생합니다.
    • RHIThread (RHI 스레드): 그래픽 API(DirectX, Vulkan 등) 호출을 위한 저수준 작업이 발생합니다.
    • GPU (GPU 스레드): 실제 GPU에서 렌더링 작업이 수행되는 시간을 보여줍니다.
    • CPU/GPU 프레임 시간: 각 프레임이 CPU/GPU에서 소요된 시간을 막대 그래프로 보여주어 병목 현상(CPU Bound, GPU Bound)을 쉽게 파악할 수 있습니다.
  • Memory Insights (메모리 인사이트): 메모리 할당 및 해제, 메모리 사용량 변화를 추적합니다. 메모리 누수나 과도한 메모리 사용량을 진단하는 데 유용합니다.
  • Log Insights (로그 인사이트): 게임 로그 메시지를 필터링하고 검색하며, 시간 경과에 따른 로그 발생을 시각화합니다.
  • Networking Insights (네트워킹 인사이트): 네트워크 트래픽, 복제된 데이터, RPC 호출 등을 분석하여 네트워크 최적화에 도움을 줍니다.

인게임 stat 명령 (빠른 진단)

stat 명령은 게임 내에서 실시간으로 성능 통계를 오버레이하여 보여주는 빠르고 편리한 도구입니다.

사용 방법
  • 콘솔 열기: 게임 실행 중 ~ 키를 눌러 콘솔을 엽니다.
  • 기본 통계
    • stat fps: 현재 FPS (프레임 속도)를 표시합니다.
    • stat unit: Game Thread, Draw Thread, GPU 시간, RHI 시간 등 주요 CPU/GPU 시간을 표시합니다. 이 정보로 CPU Bound인지 GPU Bound인지 빠르게 파악할 수 있습니다.
      • Frame: 한 프레임의 전체 결과 시간
      • Game: 게임 로직 (액터 업데이트, 물리 등)
      • Draw: 렌더 스레드 (렌더링 명령 생성)
      • RHI/RHIT: 그래픽 API 제출과 RHI 스레드 관련 시간
      • GPU: 실제 GPU 렌더링 시간
    • stat scenerendering: 씬 렌더링 관련 상세 통계 (드로우 콜, 메시 수, 셰이더 복잡도 등).
    • stat gpu: GPU 관련 상세 통계.
    • stat rhi: 렌더링 하드웨어 인터페이스 관련 통계.
    • stat lightmass: 라이트매스 관련 통계.
    • stat particles: 파티클 시스템 관련 통계.
    • stat anim: 애니메이션 시스템 관련 통계.
    • stat streaming: 텍스처 스트리밍 통계.
    • stat audio: 오디오 시스템 통계.
    • stat net: 네트워크 통계 (핑, 패킷 손실, 대역폭 사용량 등).
    • stat game: 게임 로직 관련 통계.
  • 모든 통계 표시: stat all
  • 모든 통계 숨기기: stat none
활용 예시
stat unit로 병목 현상 파악
  • Frame은 전체 결과 시간입니다. 고칠 대상이 아니라 Game, Draw, RHI/RHIT, GPU 중 어느 축이 Frame과 함께 움직이는지 보기 위한 기준입니다.
  • Game 시간이 가장 높으면 CPU Bound (Game Thread): 게임 로직, 물리, AI, 애니메이션 업데이트 등을 Unreal Insights Timing View에서 확인합니다.
  • Draw 또는 RHI/RHIT 시간이 가장 높으면 CPU Bound (Render Thread/RHI Thread): 드로우 콜(Draw Call) 수, 렌더링 상태 변경, command submission, 동기화 대기 등을 확인합니다.
  • GPU 시간이 가장 높으면 GPU Bound: 셰이더 복잡도, 오버드로우, 폴리곤 수, 해상도, ShadowDepths/BasePass/PostProcess 비용 등을 profilegpu로 확인합니다.
  • 메모리, 로딩, 텍스처 스트리밍 증상은 stat unit 축이 아니라 stat memory, stat streaming, MemReport로 별도 기록합니다.

이후 해당 통계(stat scenerendering, stat anim 등)를 통해 더 상세한 원인을 파고듭니다.

빠른 진단은 먼저 병목 축을 좁히고, 그 결과에 맞는 세부 도구로 넘어갈 때 가장 효율적입니다.

60FPS 목표라면 한 프레임 예산은 약 16.67ms, 30FPS 목표라면 약 33.33ms입니다.

같은 맵, 같은 카메라, 같은 입력, 같은 빌드 설정에서 여러 프레임을 보고 판단해야 합니다.

stat unit은 병목 축을 고른 뒤 세부 도구로 넘긴다

Frame, Game, Draw/RHI, GPU, Memory를 한 표에서 분리해 다음에 열 도구와 읽을 신호를 정한다.

관찰 축의심 영역다음 도구먼저 확인할 신호
Frame전체 프레임 결과stat unit 재측정Game/Draw/RHI/GPU 중 같이 오른 축
GameGameThread CPUUnreal Insights, stat gameTick, AI, Physics, Animation 호출
Draw/RHI렌더 명령 제출stat scenerendering, stat rhiDraw call, state change, command submit
GPUGPU 패스 실행profilegpu, stat gpuBasePass, Shadow, PostProcess, Translucency
Memory프레임 밖의 증상stat memory, stat streaming, MemReport텍스처 풀, 로딩 스파이크, 할당 급증

메모리 프로파일링

메모리 사용량을 분석하여 메모리 누수나 과도한 메모리 사용량을 진단합니다.

  • MemReport: 콘솔 명령어로, 모든 할당된 메모리에 대한 상세 보고서를 출력합니다. 이 보고서는 [ProjectName]\Saved\Logs\ 디렉토리에 .log 파일 형태로 저장됩니다. MemReport -full은 더 상세한 정보를 제공합니다.
  • stat memory: 인게임 오버레이로 현재 메모리 사용량의 요약 정보를 보여줍니다.
  • stat streaming: 텍스처 스트리밍 메모리 사용량을 확인합니다.

GPU 비주얼라이저 (GPU Visualizer)

Profiler 도구 전환 경로

프레임 저하를 발견했을 때 stat unit에서 시작해 GPU Visualizer, Unreal Insights, Asset Audit으로 좁혀 가는 의사결정 흐름을 정리한다.

  1. 프레임 축 분리

    stat unit으로 Game Thread, Render Thread, GPU 중 가장 큰 시간을 찾는다. first split

  2. GPU 비용 분해

    GPU가 높으면 Visualizer로 shadow, translucency, post process 비용을 나눈다. render pass

  3. CPU 이벤트 추적

    Game 또는 Draw가 높으면 Insights에서 함수, task, stall 구간을 확인한다. trace

  4. 에셋 원인 확인

    특정 mesh, texture, material이 원인인지 Asset Audit과 LOD 설정으로 검증한다. asset pass

GPU 바운드 문제를 진단할 때 매우 유용한 도구입니다.

렌더링 파이프라인의 각 단계에서 GPU가 얼마나 많은 시간을 소비하는지 시각적으로 보여줍니다.

사용 방법

게임 실행 중 콘솔에 profilegpu를 입력합니다.

게임 화면이 잠시 멈추고, GPU 비주얼라이저 창이 뜹니다.

이 창에서 각 렌더링 패스(Shadow Pass, Base Pass, Post Process 등)가 차지하는 시간을 확인할 수 있습니다.

각 항목을 확장하여 드로우 콜, 셰이더, 텍스처 등 더 상세한 정보를 드릴다운할 수 있습니다.

특히 Base PassShadow Pass가 높은 시간을 차지한다면, 메시의 폴리곤 수나 머티리얼 복잡도, 광원 수가 문제일 가능성이 높습니다.

Post Process가 높다면, 후처리 효과(블룸, 모션 블러, 안티앨리어싱 등)의 복잡도를 줄이는 것을 고려해야 합니다.


에셋 감사(Audit) 및 최적화 도구

특정 에셋이 성능 문제의 원인인 경우, 에셋 감사 도구를 사용할 수 있습니다.

  • Reference Viewer (참조 뷰어): 특정 에셋이 어디에서 참조되고 있는지 확인하여 불필요한 로딩을 방지합니다.
  • Size Map (크기 맵): 에셋들의 메모리 사용량을 시각적으로 보여줍니다. 어떤 에셋이 메모리를 많이 차지하는지 파악하는 데 유용합니다.
  • 에셋 디테일 패널 통계: 메시 에디터, 텍스처 에디터 등에서 해당 에셋의 폴리곤 수, 텍스처 해상도, 텍스처 그룹, 메모리 사용량 등을 확인할 수 있습니다.

최적화 과정의 워크플로우

프로파일링은 목표값, 기준선, 병목 축, 재측정을 닫힌 루프로 묶는다

최적화는 추측으로 시작하지 않고, 같은 장면에서 측정값이 어떻게 움직이는지 확인하며 반복합니다.

  1. 목표 설정 FPS

    프레임 시간을 수치로 둡니다.

  2. 기준선 기록 수정 전 같

    장면의 값을 남깁니다.

  3. 축 분리 Game, Draw, GPU 중 늦

    축을 찾습니다.

  4. 원인 확대 상세 도구

    호출 위치를 좁힙니다.

  5. 작게 변경 한 번에 하나의

    비용 축만 줄입니다.

  6. 다시 측정 개선인지 병목 이동인지

    확인합니다.

일반적인 성능 최적화 워크플로우는 다음과 같습니다.

목표 설정: 타겟 FPS, 메모리 사용량 등 명확한 성능 목표를 설정합니다.

기준선(Baseline) 측정: 최적화를 시작하기 전에 현재 성능을 측정하고 기록합니다.

병목 현상 식별: stat unit, Unreal Insights, profilegpu 등의 도구를 사용하여 가장 큰 병목 현상을 식별합니다. (예: stat unit 결과 Game 시간이 가장 높음)

원인 진단: 식별된 병목 현상에 대해 더 깊이 파고들어 구체적인 원인을 찾습니다. (예: stat anim으로 애니메이션 업데이트가 문제임을 확인)

변경 및 개선: 식별된 원인에 대한 최적화를 수행합니다 (예: 애니메이션 최적화, 폴리곤 수 줄이기, 셰이더 복잡도 감소).

다시 측정: 변경 후 성능이 개선되었는지 다시 측정하고 기준선과 비교합니다.

반복: 만족스러운 성능을 얻을 때까지 이 과정을 반복합니다.

프로파일링 도구는 결과 화면보다 선택 순서가 중요합니다.

먼저 병목 축을 좁히고, 그 축에 맞는 상세 도구로 이동해야 합니다.

프로파일링은 병목 축을 좁힌 뒤 도구를 바꾼다

처음부터 모든 도구를 켜기보다 `stat unit`으로 CPU/GPU/메모리/네트워크 중 어디가 느린지 먼저 고릅니다.

  1. 1. 기준선

    기준선 같은 맵, 같은 시점, 같은 플레이 조건에서 처음 값을 저장합니다.

  2. 2. 한 축만 변경

    한 축만 변경 코드, 에셋, 설정을 한 번에 바꾸지 않아야 원인을 잃지 않습니다.

  3. 3. 다시 측정

    다시 측정 개선 후 같은 기준으로 비교해야 실제 효과를 판단할 수 있습니다.

최적화 판단은 프레임 생명주기 안에서 어느 책임 영역이 시간을 쓰는지 분리해야 재측정 기준이 흔들리지 않습니다.

도구를 고르기 전에 가장 큰 비용 축을 고른다

같은 장면의 기준선을 저장하고 Game·Draw·GPU를 분류한 뒤, 해당 축만 추적해 한 번에 하나씩 바꾼다.

  1. 기준선

    맵·카메라·인원·빌드를 고정해 평균과 최악 프레임을 기록한다.

  2. 큰 축 분류

    stat unit 의 Frame, Game, Draw, GPU 시간부터 비교한다.

  3. 증거 추적

    장 큰 축에 맞는 캡처로 함수·패스·에셋까지 좁힌다.

  4. 수정·재측정

    원인 하나만 바꾸고 같은 조건에서 예산 통과 여부를 확인한다.

  5. 게임 스레드

    GAME Tick, AI, 물리, 애니메이션이 CPU 시간을 쓴다. Unreal Insights · Timing View

  6. 명령 준비

    DRAW / RHI 드로우 콜, 상태 전환, 인스턴싱 실패를 의심한다. stat rhi · Insights

  7. 렌더 패스

    GPU Shadow, Base Pass, Post Process와 오버드로우를 본다. profilegpu · GPU Visualizer

  8. 별도 예산

    MEMORY 프레임 축과 별개로 에셋 참조·스트리밍·로드를 추적한다. MemReport · LLM · Size Map


성능 최적화는 게임 개발의 필수적인 부분이며, 효율적인 프로파일링은 이 과정의 핵심입니다.

Unreal Insights를 통해 CPU, GPU, 메모리 등의 상세한 성능 데이터를 분석하고, stat 명령과 GPU 비주얼라이저를 통해 실시간으로 병목 현상을 진단하며, 에셋 감사 도구를 활용하여 에셋 관련 문제를 해결하는 방법을 익히는 것은 매우 중요합니다.

이러한 프로파일링 도구들을 효과적으로 사용하여 게임의 성능을 지속적으로 모니터링하고 개선함으로써, 모든 플레이어에게 최적의 게임 경험을 제공할 수 있을 것입니다.