PART 3 · 강의 1/4

Draw Call 최적화

GPU 명령 호출을 최소화하여 렌더링 효율을 높입니다

01

Draw Call이란?

GPU 명령의 기본 단위

Draw Call은 지정된 셰이더를 사용하여 메시(삼각형 배치)를 화면에 그리라는 요청입니다. 각 Draw Call은 CPU에서 GPU로 명령을 전달하는 오버헤드가 있습니다.

플랫폼별 목표 Draw Call

🎯 플랫폼별 권장 Draw Call 수
🖥️ 하이엔드 PC:
< 2000
🎮 콘솔 (PS5/XSX):
< 1500
📱 모바일 (고사양):
< 700
📱 모바일 (저사양):
< 500
⭐ Draw Call 확인 명령어
코드 숨기기
# 현재 Draw Call 수 확인 stat SceneRendering # 출력 예시 Mesh draw calls: 1247 Primitives drawn: 2.4M
02

Instancing 활용

동일 메시를 한 번의 Draw Call로

GPU Instancing은 동일한 메시를 여러 위치에 그릴 때 단일 Draw Call로 처리합니다.

⚡ Instancing 효과
StaticMeshComponent
100개 메시

= 100 Draw Calls

InstancedStaticMesh
100개 메시

= 1 Draw Call! ⚡

Instanced Static Mesh Component 사용법
코드 보기
// 일반 Static Mesh - 100개 = 100 Draw Calls for (int32 i = 0; i < 100; ++i) { UStaticMeshComponent* Mesh = CreateComponent<UStaticMeshComponent>(); Mesh->SetStaticMesh(TreeMesh); } // Instanced Static Mesh - 100개 = 1 Draw Call! UInstancedStaticMeshComponent* ISM = CreateComponent<UInstancedStaticMeshComponent>(); ISM->SetStaticMesh(TreeMesh); for (int32 i = 0; i < 100; ++i) { ISM->AddInstance(FTransform(Locations[i])); }

HISM (Hierarchical ISM)

대규모 포리지용 HISM
코드 보기
// HISM - 대규모 분산 인스턴스에 최적화 // 클러스터 단위 컬링으로 멀리 있는 인스턴스 그룹 제외 UHierarchicalInstancedStaticMeshComponent* HISM = CreateComponent<UHierarchicalInstancedStaticMeshComponent>(); HISM->SetStaticMesh(GrassMesh); // Foliage 도구는 자동으로 HISM 사용
자동 인스턴싱

UE5는 동일 메시+머티리얼 조합을 자동으로 인스턴싱합니다. 별도 설정 없이도 일부 최적화가 적용됩니다.

03

메시 병합 및 HLOD

여러 메시를 하나로

메시 병합 전략

DCC 도구에서 병합

Maya, 3DSMax, Blender에서 오브젝트 결합 후 임포트. 가장 효과적

엔진 내장 도구

Actor > Merge Actors로 여러 스태틱 메시를 단일 메시로 병합

HLOD 시스템

원거리 오브젝트를 프록시 메시로 자동 교체. World Partition 연동

HLOD 레이어 타입

타입 설명 사용 사례
Instancing 인스턴싱으로 묶음 반복 오브젝트 (나무, 바위)
Merged Mesh 메시 병합 중거리 건물
Simplified Mesh 단순화된 메시 원거리 건물
Approximated Mesh 근사 메시 매우 먼 거리
04

가시성 컬링

보이지 않는 건 그리지 않는다

👁️ 컬링 타입

📐 Frustum Culling

카메라 시야 밖 오브젝트 제외
(자동 적용)

🧱 Occlusion Culling

다른 오브젝트에 가려진 오브젝트 제외

📏 Distance Culling

일정 거리 이상 오브젝트 제외

Distance Culling 설정
코드 보기
// Static Mesh Component에서 MeshComponent->SetCullDistance(5000.0f); // 50m 이상에서 컬링 // 에디터에서: Details > LOD > Desired Max Draw Distance
Nanite와 Draw Call

Nanite는 클러스터 기반 렌더링으로 Draw Call 문제를 근본적으로 해결합니다. Nanite 지원 메시는 Draw Call 최적화 걱정 없이 사용할 수 있습니다.

SUMMARY

핵심 요약

  • Draw Call 목표: PC < 2000, 콘솔 < 1500, 모바일 < 700
  • stat SceneRendering으로 현재 Draw Call 확인
  • ISM/HISM: 동일 메시를 인스턴싱으로 단일 Draw Call
  • HLOD: 원거리 오브젝트를 프록시 메시로 교체
  • Distance Culling: 먼 거리 오브젝트 렌더링 제외
다음 단계

다음 강의에서는 Shader Complexity 분석과 머티리얼 최적화를 다룹니다.

PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Draw Call 측정 및 분석

stat RHI로 현재 씬의 Draw Call 수를 확인하세요. Instanced Static Mesh Component를 사용하여 동일 메시 100개의 Draw Call을 1개로 줄이고, 프레임 시간 개선을 측정합니다.

실습 2: 머티리얼 병합

Actor > Merge Actors 도구를 사용하여 동일 머티리얼의 여러 Static Mesh를 하나로 병합하세요. 병합 전후의 Draw Call 수와 GPU 시간을 비교합니다.

심화 과제

World Partition HLOD를 설정하여 원거리 오브젝트의 Draw Call을 자동으로 병합하세요. HLOD Layer를 구성하고, 거리별 LOD 전환 지점을 최적화하여 원거리 렌더링 비용을 50% 이상 감소시킵니다.