icon
9장 : 성능 최적화

프로파일링 도구 사용법


이전 장에서 우리는 멀티플레이어 게임의 네트워킹과 그 최적화 기법에 대해 알아보았습니다. 이제 게임 개발의 또 다른 중요한 측면이자 모든 게임에서 필수적인 부분인 성능 최적화(Performance Optimization) 에 대해 다룰 시간입니다. 게임의 성능은 프레임 속도(FPS), 반응성, 로딩 시간 등 플레이어 경험의 모든 측면에 직접적인 영향을 미칩니다.

성능 최적화는 단순히 코드를 빠르게 작성하는 것을 넘어, 게임이 어디에서 병목 현상(Bottleneck)을 겪고 있는지 정확히 파악하는 것이 중요합니다. 이를 위해 언리얼 엔진은 강력한 프로파일링(Profiling) 도구들을 제공합니다.

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


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

프로파일링은 소프트웨어의 성능을 측정하고 분석하는 과정입니다. 게임 개발에서는 주로 다음을 식별하는 데 사용됩니다.

  • 병목 현상: 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인지 빠르게 파악할 수 있습니다.
      • Game: 게임 로직 (액터 업데이트, 물리 등)
      • Draw: 렌더 스레드 (렌더링 명령 생성)
      • 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로 병목 현상 파악

  • Game 시간이 가장 높으면 CPU Bound (Game Thread): 게임 로직, 물리, AI, 애니메이션 업데이트 등 최적화 필요.
  • Draw 또는 RHI 시간이 가장 높으면 CPU Bound (Render Thread/RHI Thread): 드로우 콜(Draw Call) 수, 렌더링 상태 변경 등 최적화 필요.
  • GPU 시간이 가장 높으면 GPU Bound: 셰이더 복잡도, 오버드로우, 폴리곤 수, 해상도 등 최적화 필요.

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

메모리 프로파일링

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

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

GPU 비주얼라이저 (GPU Visualizer)

GPU 바운드 문제를 진단할 때 매우 유용한 도구입니다. 렌더링 파이프라인의 각 단계에서 GPU가 얼마나 많은 시간을 소비하는지 시각적으로 보여줍니다.

사용 방법

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

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

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

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

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

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


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

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

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

최적화 과정의 워크플로우

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

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

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

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

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

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

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

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


마치며

성능 최적화는 게임 개발의 필수적인 부분이며, 효율적인 프로파일링은 이 과정의 핵심입니다. Unreal Insights를 통해 CPU, GPU, 메모리 등의 상세한 성능 데이터를 분석하고, stat 명령과 GPU 비주얼라이저를 통해 실시간으로 병목 현상을 진단하며, 에셋 감사 도구를 활용하여 에셋 관련 문제를 해결하는 방법을 익히는 것은 매우 중요합니다. 이러한 프로파일링 도구들을 효과적으로 사용하여 게임의 성능을 지속적으로 모니터링하고 개선함으로써, 모든 플레이어에게 최적의 게임 경험을 제공할 수 있을 것입니다.