언리얼 엔진 5 나나이트와 루멘 저사양 최적화: 스케일러빌리티(Scalability) 설정 가이드

언리얼 엔진 5의 핵심 렌더링 기술인 나나이트(Nanite)와 루멘(Lumen)을 GTX 1060, GTX 1660급 저사양 환경에서도 원활하게 구동하기 위한 스케일러빌리티 설정과 콘솔 변수 최적화 기법을 정리합니다.

✓ 복사 완료!
챕터모바일/저사양 기기 최적화
난이도중급
상태● 검토 완료
대상 엔진
Unreal Engine
최종 업데이트
언리얼 엔진 5 나나이트와 루멘 저사양 최적화: 스케일러빌리티(Scalability) 설정 가이드

핵심 요약

언리얼 엔진 5(UE5)에서 저사양 타깃을 지원하려면 나나이트를 무작정 비활성화하기보다 r.Nanite.MaxPixelsPerEdge와 뷰 LOD 오프셋을 조절해 래스터화 비용을 낮추는 것이 유리합니다. 루멘은 저사양 프리셋에서 하드웨어 레이 트레이싱(HWRT) 대신 소프트웨어 레이 트레이싱(SWRT)의 글로벌 트레이싱만 사용하거나 r.Lumen.DiffuseIndirect.Allow=0을 통해 SSGI(Screen Space Global Illumination) 및 베이크 라이팅으로 단계적 폴백(Fallback)을 구성해야 합니다.

왜 나나이트와 루멘은 저사양 하드웨어에서 병목을 일으킬까?

언리얼 엔진 5의 차세대 렌더링 파이프라인인 나나이트(Nanite)와 루멘(Lumen)은 고사양 GPU 아키텍처에 최적화되어 있습니다. 지포스 GTX 1060, GTX 1660, 라데온 RX 580과 같은 보급형 GPU나 휴대용 기기(Steam Deck 등)에서는 연산 유닛 수와 메모리 대역폭 한계로 인해 기본 설정 상태에서 목표 프레임 유지가 어렵습니다.

주요 병목 원인은 다음과 같습니다:

  1. 나나이트의 컴퓨트 셰이더 및 래스터화 부하: 나나이트는 화면 픽셀 크기에 맞춰 마이크로 폴리곤 클러스터를 실시간으로 선별(Culling)하고 래스터화합니다. 저사양 GPU는 64비트 원자적 연산(Atomic Operations)과 하드웨어 래스터 가속 능력이 부족하여 가시성 버퍼(Visibility Buffer) 생성 단계에서 긴 프레임 지연이 발생합니다.
  2. 루멘의 광선 추적과 공간 데이터 구조 갱신: 루멘의 소프트웨어 레이 트레이싱(SWRT)은 전역 부호 거리 필드(Global SDF)와 메시 거리 필드(Mesh SDF)를 추적합니다. 저사양 환경에서는 SDF 생성 및 캐시 갱신, 스크린 프로브 수집(Screen Probe Gather) 단계에서 GPU 자원이 급격히 고갈됩니다.

UE5 저사양 프로파일링 뷰포트 분석 화면

Frame Budget=1000Target FPS ms\text{Frame Budget} = \frac{1000}{\text{Target FPS}} \text{ ms}

60 FPS 타깃 환경에서 허용되는 전체 프레임 시간은 약 16.6 ms16.6\text{ ms}이며 30 FPS 타깃에서는 33.3 ms33.3\text{ ms}입니다. 저사양 타깃에서는 렌더링 스레드와 GPU 패스 전체에서 나나이트에 2.5 ms2.5\text{ ms}, 루멘에 4.0 ms4.0\text{ ms} 이하로 예산을 할당해야 안정적인 플레이가 가능합니다.

flowchart TD
    A["사용자 하드웨어 사양 감지"] --> B{"DirectX 12 / DXR 지원 여부"}
    B -- "지원 (RTX 2060 이상)" --> C["High / Epic 프리셋: HWRT Lumen + Nanite 풀 가동"]
    B -- "미지원 / 저사양 GPU" --> D{"VRAM 4GB 이상 및 셰이더 모델 6.6"}
    D -- "지원 (GTX 1660 / RX 5500XT)" --> E["Medium 프리셋: SWRT Global Tracing + Nanite 간소화"]
    D -- "저사양 (GTX 1060 이하 / 내장 GPU)" --> F["Low 프리셋: Lumen OFF -> SSGI 폴백 + Nanite Fallback Mesh"]

저사양 타깃을 위한 나나이트(Nanite) 스케일러빌리티 최적화

많은 개발자가 저사양 옵션에서 단순히 r.Nanite=0을 적용합니다. 그러나 나나이트를 비활성화하면 원본 스태틱 메시의 전통적인 LOD(Level of Detail) 체인이 준비되어 있지 않은 경우 드로우 콜(Draw Call) 폭증과 지오메트리 오버헤드가 발생합니다. 따라서 나나이트를 켜 둔 상태에서 내부 연산 해상도와 클러스터 밀도를 낮추는 전략이 권장됩니다.

설정 변수기본값 (Epic)Low / Medium 권장값설명 및 성능 효과
r.Nanite.MaxPixelsPerEdge1.02.0 ~ 4.0클러스터 분할 기준 픽셀 크기. 값을 높이면 폴리곤 밀도가 감소하여 연산량이 대폭 절감됨
r.Nanite.ViewMeshLODBias.Offset01 ~ 2뷰포트 거리 기반 메시 LOD를 강제로 다운그레이드
r.Nanite.MaxNodesPerFrame26214465536프레임당 처리할 최대 BVH 노드 수 제한
r.Nanite.MaxCandidateClustersPerPage40961024클러스터 캐시 페이지 크기 제한을 통한 VRAM 절약
r.Nanite.Shadows10 (Low 기준)가상 섀도 맵(VSM) 대신 기본 섀도 맵으로 나나이트 그림자 렌더링

나나이트 폴백 메시(Fallback Mesh) 설정 팁

내장 그래픽이나 구형 모바일 칩셋처럼 나나이트를 반드시 꺼야 하는 플랫폼을 타깃팅할 때는 스태틱 메시 에디터의 Nanite Settings > Fallback Relative Error 또는 Fallback Percent Triangles를 사전에 10%~20% 수준으로 정밀하게 구워두어야 합니다. 이를 생략하면 r.Nanite=0 상태에서 수백만 폴리곤의 원본 고밀도 지오메트리가 그대로 렌더링되어 프레임이 급락합니다.

저사양 타깃을 위한 루멘(Lumen) 스케일러빌리티 단계별 튜닝

루멘은 글로벌 일루미네이션(GI)과 리플렉션(Reflections)을 독립적으로 제어할 수 있습니다. 저사양 설정에서는 소프트웨어 레이 트레이싱(SWRT) 내에서 복잡한 디테일 트레이싱(Detail Tracing)을 배제하고 글로벌 트레이싱(Global Tracing)만 사용하거나 스크린 스페이스 기법으로 단계적 강등을 진행합니다.

루멘 소프트웨어 트레이싱 최적화 시각화 비교

1단계: 소프트웨어 레이 트레이싱 경량화 (Medium 타깃)

; 글로벌 SDF 트레이싱 해상도 축소
r.LumenScene.GlobalSDF.Resolution=0.5
r.LumenScene.ClipmapResolution=128

; 디테일 트레이싱 비활성화 (메시 SDF 개별 추적 생략, 글로벌 볼륨만 추적)
r.Lumen.TraceMeshSDFs=0

; 스크린 프로브 해상도 다운샘플링
r.Lumen.ScreenProbeGather.DownsampleFactor=16
r.Lumen.ScreenProbeGather.TracingOctahedronResolution=4

; 리플렉션 샘플 수 제한
r.Lumen.Reflections.MaxRoughnessToTrace=0.4
r.Lumen.Reflections.ScreenSpaceReconstruction=0

2단계: 루멘 완전 비활성화 및 SSGI 폴백 (Low 타깃)

완전한 저사양 기기에서는 루멘 대신 SSGI와 앰비언트 오클루전(AO)을 사용할 수 있습니다. UE 5.8부터 r.SSGI.Enable 콘솔 변수는 제거되었으므로, Project Settings > Engine > Rendering > Global Illumination > Dynamic Global Illumination Method에서 Screen Space (Beta)를 선택하거나 Post Process Volume의 GI Method를 지정해야 합니다. 아래 콘솔 변수는 SSGI를 활성화하는 설정이 아니라 품질 조정용입니다.

; 루멘 GI 및 리플렉션 해상도 비활성화
r.Lumen.DiffuseIndirect.Allow=0
r.Lumen.Reflections.Allow=0

; SSGI가 프로젝트 설정 또는 Post Process Volume에서 선택된 경우 품질 조정
r.SSGI.Quality=1

; 반사는 스크린 스페이스 리플렉션(SSR) 및 리플렉션 캡처로 대체
r.SSR.Quality=1

DefaultScalability.ini 구성 예제

프로젝트의 Config/DefaultScalability.ini 파일에 각 품질 단계별 설정을 체계적으로 구성하면 사용자가 옵션을 바꿀 때 엔진이 자동으로 최적의 콘솔 변수를 적용합니다.

[GlobalIlluminationQuality@0]
; Low: GI 메서드는 프로젝트 설정 또는 Post Process Volume에서 선택
r.Lumen.DiffuseIndirect.Allow=0
; SSGI가 선택된 경우에만 다음 품질 설정 적용
r.SSGI.Quality=1
r.DistanceFieldAO=0

[GlobalIlluminationQuality@1]
; Medium: 경량화된 소프트웨어 루멘 (SWRT Global Only)
r.Lumen.DiffuseIndirect.Allow=1
r.Lumen.TraceMeshSDFs=0
r.LumenScene.GlobalSDF.Resolution=0.5
r.Lumen.ScreenProbeGather.DownsampleFactor=16
r.Lumen.ScreenProbeGather.TemporalFilter=1

[GlobalIlluminationQuality@2]
; High: 표준 소프트웨어 루멘 (SWRT Detail Tracing 활성화)
r.Lumen.DiffuseIndirect.Allow=1
r.Lumen.TraceMeshSDFs=1
r.LumenScene.GlobalSDF.Resolution=1.0
r.Lumen.ScreenProbeGather.DownsampleFactor=8

[GlobalIlluminationQuality@3]
; Epic: 고품질 소프트웨어 또는 하드웨어 루멘
r.Lumen.DiffuseIndirect.Allow=1
r.Lumen.TraceMeshSDFs=1
r.Lumen.HardwareRayTracing=0 ; HWRT 지원 기기에서는 1로 확장
[ShadowQuality@0]
; Low: VSM 대신 전통적인 캐스케이드 섀도 맵(CSM) 사용
r.Shadow.Virtual.Enable=0
r.ShadowQuality=1
r.Shadow.MaxResolution=1024

[ShadowQuality@1]
; Medium: 해상도 타일을 제한한 가상 섀도 맵(VSM)
r.Shadow.Virtual.Enable=1
r.Shadow.Virtual.ResolutionLodBiasDirectional=1.0
r.Shadow.Virtual.ClipmapLodBias=1

런타임 적용 및 동적 스케일러빌리티 연동 방법

게임 실행 중 사용자의 그래픽 설정 메뉴나 벤치마크 루틴에 맞춰 스케일러빌리티를 동적으로 적용하려면 UGameUserSettings API를 활용합니다.

#include "GameFramework/GameUserSettings.h"

void UOptimizationBlueprintLibrary::ApplyLowSpecPreset()
{
    if (UGameUserSettings* UserSettings = UGameUserSettings::GetGameUserSettings())
    {
        // 글로벌 일루미네이션: 0(Low) 또는 1(Medium)
        UserSettings->SetGlobalIlluminationQuality(1);
        
        // 그림자 품질 축소 (VSM 해상도 저하)
        UserSettings->SetShadowQuality(1);
        
        // 포스트 프로세스 및 반사 품질 강등
        UserSettings->SetReflectionQuality(1);
        UserSettings->SetPostProcessingQuality(1);
        
        // 설정 디스크 저장 및 엔진에 즉시 적용
        UserSettings->ApplySettings(false);
    }
}

자주 묻는 질문 (FAQ)

Q1. 저사양 옵션에서 나나이트를 완전히 끄는 것(r.Nanite=0)이 더 유리할까요?

일반적으로 나나이트를 완전히 끄는 것은 권장되지 않습니다. 나나이트를 끄면 프로젝트 내 모든 에셋이 기존의 디스턴스 기반 LOD 및 정적 드로우 콜 파이프라인으로 렌더링됩니다. 이때 에셋별 전통적 LOD가 정교하게 생성되어 있지 않다면 오히려 CPU 렌더 스레드 드로우 콜과 버텍스 연산량이 폭증하여 프레임이 더 심하게 떨어집니다. r.Nanite.MaxPixelsPerEdge를 2.0~4.0으로 높여 클러스터링 밀도를 낮추는 것이 성능과 비주얼 타협 측면에서 훨씬 안전합니다.

Q2. 루멘을 저사양 환경에서 소프트웨어 레이 트레이싱으로 유지할 때 가장 무거운 병목은 무엇인가요?

메시 거리 필드(Mesh SDF) 추적과 전역 SDF 생성 비용입니다. 오브젝트가 씬 전체에 과도하게 밀집해 있거나 변형(WPO, Foliage Animation)이 일어나는 에셋이 많으면 SDF 생성 및 트레이싱 부하가 급증합니다. 이를 해결하려면 r.Lumen.TraceMeshSDFs=0으로 설정하여 개별 메시 SDF 조회를 건너뛰고 전역 볼륨(Global SDF)만 추적하도록 제한해야 합니다.

Q3. 스케일러빌리티 프리셋 변경 시 발생하는 프레임 히치(Hitch)를 방지하려면 어떻게 해야 하나요?

품질 변경 시 가상 섀도 맵 캐시 초기화 및 거리 필드(Distance Field) 데이터 재구축으로 인해 순간적인 히치가 발생할 수 있습니다. 런타임 로딩 화면이나 벤치마크 단계에서 미리 UGameUserSettings::ApplySettings를 호출하고 레벨 전환 시점에 풀백 캐시를 리셋하도록 플로우를 구성하는 것이 좋습니다.

정리

언리얼 엔진 5의 나나이트와 루멘은 고사양 플랫폼만을 위한 전유물이 아닙니다. 핵심 콘솔 변수와 DefaultScalability.ini를 정밀하게 구성하고 나나이트 클러스터링 해상도 완화 및 루멘 SDF 트레이싱 단계적 강등을 적용하면 GTX 1060~1660급 저사양 하드웨어에서도 차세대 비주얼 감각을 유지하면서 안정적인 60 FPS를 확보할 수 있습니다.