환경 요소의 성능 분석
레벨 요소를 충분히 올렸다면, 이제는 보기 좋은 장면을 유지 가능한 성능으로 바꾸는 단계입니다.
레벨이 복잡해질수록 CPU/GPU/메모리 부담은 빠르게 커집니다. 그래서 성능 최적화(Performance Optimization)는 단순히 더 빠르게가 아니라, 다양한 기기에서 안정적인 프레임과 일관된 사용자 경험을 보장하는 과정입니다.
성능 최적화의 중요성 및 목표
성능 최적화는 게임 개발의 전 과정에 걸쳐 지속적으로 이루어져야 하는 작업입니다.
- 프레임 속도 (FPS) 유지: 플레이어가 쾌적하게 게임을 즐기려면 안정적인 프레임 속도(초당 프레임 수)가 필수적입니다. 목표 FPS (예: PC 60 FPS, 모바일 30 FPS)를 달성하고 유지해야 합니다.
- 다양한 하드웨어 지원: 저사양 기기에서도 게임이 원활하게 작동하도록 하여 더 많은 플레이어에게 접근성을 제공합니다.
- 배터리 효율 (모바일): 모바일 게임의 경우, 최적화는 배터리 소모를 줄여 플레이 시간을 늘리는 데 기여합니다.
- 개발 효율성: 최적화된 프로젝트는 빌드 시간 단축, 에디터 성능 향상 등 개발 과정 자체의 효율성도 높입니다.
- 버그 감소: 성능 저하로 인한 물리 버그, 로딩 지연 등의 문제를 예방합니다.
성능 분석을 위한 기본 개념
성능 분석을 시작하기 전에 몇 가지 핵심 개념을 이해해야 합니다.
CPU (Central Processing Unit)
- 역할: 게임 로직, 물리 시뮬레이션, AI 계산, 애니메이션 블렌딩, 드로우 콜(Draw Call) 준비 등 게임의 두뇌 역할을 하는 모든 계산을 담당합니다.
- CPU 바운드 (CPU Bound): CPU가 GPU보다 느려 게임의 전체 프레임 속도를 제한하는 상태를 의미합니다.
-
주요 병목 요인
- 과도한 블루프린트/C++ 로직:
Event Tick에서 너무 복잡한 계산을 수행. - 많은 액터 수: 레벨에 배치된 액터 수가 너무 많거나, 복잡한 로직을 가진 액터가 많을 때.
- 물리 시뮬레이션: 동시에 많은 오브젝트가 물리 시뮬레이션될 때.
- AI 계산: 복잡한 AI 로직이나 많은 수의 AI 캐릭터.
- 드로우 콜: CPU가 GPU에게 렌더링할 오브젝트 목록을 전달하는 횟수. 드로우 콜 수가 많으면 CPU 오버헤드가 증가합니다.
- 과도한 블루프린트/C++ 로직:
GPU (Graphics Processing Unit)
- 역할: 메시 렌더링, 셰이더 계산, 포스트 프로세싱, 그림자, 광원 계산 등 그래픽 관련 모든 작업을 담당합니다.
- GPU 바운드 (GPU Bound): GPU가 CPU보다 느려 게임의 전체 프레임 속도를 제한하는 상태를 의미합니다.
-
주요 병목 요인
- 폴리곤 수: 화면에 보이는 총 폴리곤 수가 너무 많을 때.
- 오버드로우 (Overdraw): 투명하거나 반투명한 오브젝트(파티클, 유리, 식물)가 많이 겹쳐 렌더링될 때.
- 복잡한 셰이더/머티리얼: 연산량이 많은 복잡한 머티리얼 사용.
- 그림자: 다수의 동적 그림자 또는 고해상도 그림자.
- 포스트 프로세싱: 블룸, 앰비언트 오클루전, 스크린 스페이스 리플렉션 등 고비용 후처리 효과.
- 광원: 동적 광원 수가 많거나, 넓은 범위에 영향을 미치는 광원.
언리얼 엔진의 성능 분석 도구
언리얼 엔진은 CPU와 GPU 병목 현상을 진단할 수 있는 다양한 도구를 제공합니다.
Stat 명령어
게임 플레이 중 (Alt + P 또는 Play 버튼) 콘솔 (Shift + ~ 키)에 입력하여 실시간 통계를 확인할 수 있습니다.
Stat FPS: 현재 프레임 속도(FPS)를 표시합니다. 가장 기본적인 성능 지표입니다.-
Stat UnitGame: CPU에서 게임 로직(블루프린트, AI, 물리) 처리 시간 (밀리초).Draw: CPU에서 렌더링 명령을 GPU에 전달하는 시간 (드로우 콜 준비).GPU: GPU에서 그래픽 렌더링 시간 (밀리초).Frame: 총 프레임 시간 (밀리초).- 활용:
Game시간이 높으면 CPU 바운드,GPU시간이 높으면 GPU 바운드를 의심할 수 있습니다.Draw시간이 높다면 CPU가 드로우 콜 준비에 너무 많은 시간을 쓰고 있다는 의미입니다. - 예산 기준: 60FPS 목표는 한 프레임 약 16.67ms, 30FPS 목표는 약 33.33ms입니다. 같은 맵, 같은 카메라, 같은 해상도와 Scalability 조건에서 여러 프레임을 보고 가장 긴 축을 먼저 판정합니다.
Stat Engine: 엔진의 다양한 서브시스템(렌더링, 물리, 애니메이션 등)의 CPU 시간을 상세하게 보여줍니다.Game시간이 높을 때 어느 부분이 문제인지 더 깊이 파고들 때 사용합니다.Stat SceneRendering: 렌더링 파이프라인의 각 단계에 대한 GPU 시간을 상세하게 보여줍니다.GPU시간이 높을 때 어느 렌더링 단계가 문제인지 파악하는 데 유용합니다. (예:Lights,Translucency,PostProcess)Stat RHI: 하위 수준 렌더링 인터페이스 통계를 보여줍니다.Stat D3D12RHI/Stat VulkanRHI: 특정 그래픽 API에 대한 상세 통계를 보여줍니다.Unreal Insights:Game이나Draw축이 길 때 GameThread, RenderThread, RHIThread의 실제 호출 위치와 지속 시간을 타임라인으로 확인합니다.
ProfileGPU
- 역할: GPU 렌더링 파이프라인의 각 단계에서 정확히 얼마의 시간이 소요되는지 계층적으로 보여주는 강력한 도구입니다.
- 사용법: 게임 플레이 중 콘솔에
ProfileGPU를 입력합니다. 별도의 창이 뜨면서 상세한 GPU 통계가 표시됩니다. - 활용:
Translucency(투명도, 파티클),PostProcess(후처리),ShadowDepths(그림자 깊이),BasePass(주요 메시 렌더링) 등 어느 렌더링 단계가 가장 많은 시간을 소모하는지 파악하여 GPU 병목의 근본 원인을 찾습니다.
뷰포트 시각화 모드
레벨 에디터 뷰포트 좌측 상단의 뷰 모드(View Mode) 드롭다운 메뉴에서 선택할 수 있습니다.
Overdraw (오버드로우): 투명/반투명 오브젝트가 겹쳐 렌더링되는 정도를 색상으로 보여줍니다. 흰색에 가까울수록 오버드로우가 심하여 GPU 부하가 높습니다. (예: 많은 파티클, 복잡한 식물)Shader Complexity (셰이더 복잡도): 머티리얼의 셰이더 연산 복잡도를 색상으로 보여줍니다. 빨간색에 가까울수록 셰이더가 복잡하여 GPU 부하가 높습니다.Light Complexity (광원 복잡도): 각 픽셀에 영향을 미치는 광원의 수를 색상으로 보여줍니다. 동적 광원이 많은 영역을 식별합니다.Collision (충돌): 오브젝트의 충돌 메시를 시각적으로 보여줍니다. 불필요하게 복잡한Complex Collision을 찾아낼 수 있습니다.LOD Coloration (LOD 색상): 각 메시의 현재 LOD 레벨을 색상으로 보여줍니다. LOD가 적절하게 작동하는지, 너무 낮은 LOD가 사용되거나 너무 높은 LOD가 멀리서 사용되는지 확인합니다.- 활용: 시각적으로 병목 현상이 예상되는 부분을 빠르게 식별할 수 있습니다.
도구를 선택할 때는 질문 → 도구 → 지표 → 액션 순서로 매핑하면, 병목 원인을 추측이 아닌 데이터로 좁힐 수 있습니다. Game은 Tick, AI, 물리, 블루프린트 호출을, Draw는 드로우콜과 렌더 제출을, GPU는 ShadowDepths, BasePass, PostProcess 같은 패스 비용을 먼저 확인합니다.
환경 요소별 성능 분석 포인트
이제 실제 환경 요소들을 위 도구들을 사용하여 어떻게 분석하는지 알아봅시다.
메시 (Meshes)
Stat SceneRendering&Stat D3D12RHI:BasePass,DrawCalls항목을 확인하여 화면에 보이는 메시의 총 폴리곤 수, 드로우 콜 수를 확인합니다.LOD Coloration뷰 모드: 메시 LOD가 적절하게 작동하는지 확인합니다. 너무 멀리 있는 오브젝트가 높은 LOD로 렌더링되고 있지 않은지 확인합니다.-
해결책
- 불필요한 메시 폴리곤 감소 (리토폴로지, 최적화).
- 적절한 LOD 설정 및 생성.
- 하나의 메시로 합칠 수 있는 인접한 작은 메시들을 액터 병합 (Merge Actors) 기능으로 합쳐 드로우 콜 감소.
머티리얼 및 셰이더 (Materials & Shaders)
Shader Complexity뷰 모드: 복잡한 셰이더를 사용한 오브젝트를 식별합니다.ProfileGPU:BasePass항목 내의Shader관련 비용을 확인합니다.-
해결책
- 복잡한 셰이더 연산 (특히 픽셀 셰이더) 최소화.
- 텍스처 샘플러 수 줄이기.
- 불필요한 노드 제거.
Translucent(투명) 머티리얼 사용 최소화 (오버드로우 유발).
광원 (Lighting)
Light Complexity뷰 모드: 동적 광원이 너무 많은 영역을 식별합니다.Stat SceneRendering&ProfileGPU:Lights,ShadowDepths항목을 확인하여 광원 계산 및 그림자 렌더링 비용을 분석합니다.-
해결책
- 가능한
Static또는Stationary광원을 사용하고Movable광원 수는 최소화. - 광원의
Attenuation Radius를 필요한 만큼만 작게 설정. - 그림자 품질 설정 조정.
- 가능한
파티클 및 특수 효과 (Particles & VFX)
Overdraw뷰 모드: 투명 파티클의 오버드로우 정도를 확인합니다.Stat SceneRendering&ProfileGPU:Translucency항목을 확인하여 투명 오브젝트 렌더링 비용을 분석합니다.-
해결책
- 파티클 스폰 속도 및 최대 파티클 수 제한.
- 파티클 재질의 오버드로우 최소화 (Masked 재질 고려).
- 파티클의
Cull Distance설정. - GPU 파티클 시스템 (
Niagara의 GPU Compute Sim) 고려.
물리 시뮬레이션 (Physics Simulation)
Stat Physics: 물리 오브젝트 수, 충돌 쌍 수, 물리 스텝 시간 등을 확인하여 CPU 병목을 진단합니다.Collision뷰 모드: 불필요하게 복잡한 충돌 메시를 식별합니다.-
해결책
Simple Collision적극 활용,Complex Collision사용 제한.Simulate Physics활성화 오브젝트 수 제한.- 물리 오브젝트 슬립 활용.
- 고속 오브젝트에만
CCD사용.
포스트 프로세싱 비용 분석
ProfileGPU:PostProcess항목을 확인하여 후처리 효과의 비용을 분석합니다.-
해결책
- 불필요한 후처리 효과 비활성화.
- 각 효과의 품질(
Intensity,Quality,Resolution등) 설정 조정.
성능 분석 및 최적화 워크플로우
목표 설정: 프로젝트의 목표 플랫폼과 목표 FPS를 명확히 합니다.
- 문제가 발생할 것으로 예상되는 영역(가장 복잡한 레벨, 오브젝트가 많은 곳)에서 테스트를 진행합니다.
Stat Unit,ProfileGPU, 뷰포트 시각화 모드 등 도구를 사용하여 병목 현상을 식별합니다.- CPU 바운드인지, GPU 바운드인지 먼저 파악합니다.
원인 식별: 분석된 데이터를 바탕으로 병목의 구체적인 원인(예: 과도한 오버드로우, 복잡한 셰이더, 너무 많은 물리 오브젝트)을 식별합니다.
최적화 적용: 식별된 원인에 맞춰 이 절에서 제시된 최적화 전략들을 적용합니다.
재측정 및 반복: 최적화를 적용한 후 다시 성능을 측정하여 개선 여부를 확인합니다. 만족할 만한 결과가 나올 때까지 이 과정을 반복합니다.
프로파일링 의사결정 순서 (실무용)
Stat Unit으로 Game, Draw, GPU 중 어디가 프레임 예산을 넘는지 먼저 고정합니다.- CPU 병목이면 액터 틱, 물리, AI, 블루프린트 로직 순으로 비용을 줄입니다.
- Draw 병목이면 드로우콜, 컴포넌트 수, 머티리얼 섹션, HLOD/Instancing 가능성을 확인합니다.
- GPU 병목이면 오버드로우, 그림자, 포스트 프로세스, 투명 머티리얼 순으로 줄입니다.
- 최적화 1회마다 동일한 카메라 위치/시나리오로 재측정하여 개선 폭을 기록합니다.
- 목표 FPS에 도달하면 품질 옵션(Scalability)별 하한선도 함께 검증합니다.
Stat Unit의 Game, Draw, GPU 값을 먼저 나누면 어떤 도구로 더 깊게 볼지 결정하기 쉽습니다.
성능 병목 점검 체크리스트
Stat Unit측정 결과를 스크린샷/로그로 남기고 개선 전후를 비교했는가?- 병목 원인을 추정이 아니라
ProfileGPU/시각화 모드로 확인했는가? - 최적화 후 아트 품질 저하(깜빡임, 그림자 깨짐, 반사 품질 저하)를 검수했는가?
- 저사양/중간/고사양 프리셋에서 동일한 기능이 안정적으로 동작하는가?
- 팀 내 성능 기준(FPS, 메모리, 로딩 시간)을 문서화했는가?
성능 분석 실습은 숫자를 읽는 것에서 끝나지 않고, 병목 판정과 다음 실험을 같은 양식으로 고정해야 반복 개선이 가능합니다.
환경 요소 성능 분석은 프로젝트를 안정화하는 필수 단계입니다.
Stat 명령어, ProfileGPU, 뷰포트 시각화와 같은 도구를 활용해 병목을 수치로 확인하고, 요소별 개선 포인트를 반복 점검해 보세요. 꾸준한 분석과 조정이 최종 사용자 경험의 품질을 결정합니다.
환경 요소의 성능 분석은 작업 장면, 성능 영향, 적용 범위, 검증 기준으로 점검합니다.
환경 요소의 성능 분석에서 놓치기 쉬운 기준은 보충 점검 항목으로 다시 확인합니다.