본문 바로가기

언리얼러닝/최적화

언리얼 최적화 Gemini질문

어떤 특정 부분에 대해 더 자세히 알고 싶으신가요? 예를 들어, 다음과 같은 내용들이 있습니다.

  • 성능 프로파일링 도구: 언리얼 엔진에서 제공하는 프로파일링 도구(예: Stat 명령, 언리얼 인사이트) 사용법
  • CPU 최적화: 드로우콜 감소, Tick 함수 최적화, 불필요한 오브젝트 제거, 멀티스레딩 활용 등
  • GPU 최적화: 셰이더 복잡도 감소, 오버드로우 최소화, 텍스처 최적화, LOD(Level of Detail) 활용, 컬링 최적화 등
  • 메모리 최적화: 텍스처, 메쉬, 애니메이션 등 에셋 메모리 관리, 가비지 컬렉션 이해
  • 빌드 및 패키징 최적화: 데이터 압축, 스트리밍, 불필요한 콘텐츠 제거
  • 네트워크 최적화: 멀티플레이어 게임 시 네트워크 대역폭 및 레이턴시 관리
  • 플랫폼별 최적화: PC, 모바일, 콘솔 등 각 플랫폼의 특성에 맞는 최적화 전략

언리얼 비디오 메모리 부족 문제를 해결하고 싶어

언리얼 엔진에서 비디오 메모리 부족 문제를 해결하고 싶으시는군요. 비디오 메모리(VRAM) 부족은 게임 성능 저하와 크래시의 주요 원인이 될 수 있습니다. 이 문제를 해결하기 위한 몇 가지 방법을 알려드리겠습니다.

우선, 비디오 메모리 사용량을 분석하고 줄이기 위한 주요 방법들을 찾아보겠습니다. 언리얼 엔진에서 비디오 메모리(VRAM) 부족 문제를 해결하기 위한 여러 가지 방법이 있습니다. 주로 리소스 사용량을 줄이고, 효율적으로 관리하는 것이 핵심입니다.

1. 비디오 메모리 사용량 분석

문제를 해결하기 전에 무엇이 VRAM을 가장 많이 사용하는지 파악하는 것이 중요합니다. 언리얼 엔진은 이를 위한 강력한 도구를 제공합니다.

  • Unreal Insights (언리얼 인사이트): UnrealInsights.exe를 실행하여 트레이스 파일을 열고, Memory Insights 탭에서 메모리 사용량 추이를 확인할 수 있습니다. 특히 LLM(Low-Level Memory Tracker) 태그를 통해 어떤 종류의 리소스가 메모리를 많이 사용하는지 상세히 파악할 수 있습니다.
    • 콘솔 명령 stat LLMFULL 또는 stat LLM을 게임 내에서 사용하여 LLM 통계를 실시간으로 볼 수 있습니다.
    • -LLMCSV 명령줄 인자를 사용하여 .CSV 파일로 메모리 통계를 출력할 수도 있습니다. (Saved/Profiling/LLM/ 경로에 저장)
  • memreport 콘솔 명령: memreport -full을 입력하면 현재 렌더링에 사용되는 RHI 메모리(GPU 메모리)를 포함하여 다양한 메모리 사용량에 대한 자세한 보고서가 생성됩니다. 이를 통해 어떤 텍스처, 메쉬, 렌더 타겟 등이 메모리를 많이 차지하는지 확인할 수 있습니다.
  • Size Map (사이즈 맵): 에디터에서 에셋(예: 텍스처, 메쉬, 블루프린트)을 우클릭하고 "Size Map"을 선택하면 해당 에셋이 사용하는 메모리 양을 시각적으로 확인할 수 있습니다. 어떤 에셋이 용량이 큰지 파악하는 데 유용합니다.

2. 주요 VRAM 사용 리소스 최적화

VRAM 부족의 주범은 보통 텍스처, 메쉬, 렌더 타겟입니다. 각각을 최적화하는 방법을 살펴보겠습니다.

2.1. 텍스처 최적화

텍스처는 VRAM 사용량의 상당 부분을 차지합니다.

  • 텍스처 해상도 줄이기:
    • 필요 이상으로 큰 해상도의 텍스처를 사용하고 있지 않은지 확인합니다. (예: 멀리서 보이는 오브젝트에 4K 텍스처 사용 등)
    • 텍스처 에셋 속성에서 Maximum Texture Size를 설정하여 로드될 때의 최대 해상도를 제한할 수 있습니다.
    • LODBias 값을 조절하여 텍스처의 MipMap 레벨을 강제로 높여 해상도를 낮출 수 있습니다. (값이 높을수록 해상도 낮아짐)
  • Virtual Texturing (가상 텍스처링): 언리얼 엔진 5부터는 가상 텍스처링을 활성화하여 필요한 부분의 MipMap 레벨만 메모리에 로드하도록 할 수 있습니다. 이는 특히 대규모 월드나 매우 고해상도 텍스처를 사용할 때 효과적입니다. (프로젝트 세팅에서 Virtual Textures 검색 후 활성화)
  • 압축 포맷 사용: 텍스처의 압축 포맷을 최적화합니다. 각 플랫폼(PC, 모바일 등)에 맞는 최적의 압축 포맷을 선택합니다. (예: BC1/BC3, ASTC 등)
  • 불필요한 MipMap 제거: 일부 텍스처는 MipMap이 필요 없을 수 있습니다(예: UI 아이콘). 해당 텍스처의 MipMap 생성을 비활성화하여 메모리를 절약합니다.
  • 채널 팩킹: 여러 개의 작은 흑백 텍스처(예: Roughness, Metallic, Ambient Occlusion)를 하나의 텍스처의 각 RGB 채널에 팩킹하여 사용합니다. 이는 드로우콜과 메모리 사용량을 동시에 줄일 수 있습니다.
  • 스트리밍 설정: 텍스처 스트리밍을 활성화하여 카메라에 가까운 텍스처만 고해상도로 로드하고, 멀리 있는 텍스처는 저해상도로 로드하도록 합니다. (텍스처 에셋의 LOD Group 설정)

2.2. 메쉬 최적화

메쉬의 폴리곤 수와 본(Bone) 수는 VRAM에 큰 영향을 미칩니다.

  • LOD (Level of Detail):
    • 모든 스태틱 메쉬와 스켈레탈 메쉬에 적절한 LOD를 설정합니다. 카메라와의 거리에 따라 자동으로 폴리곤 수가 적은 버전의 메쉬가 렌더링되도록 합니다.
    • 자동 LOD 생성 기능을 사용하거나 수동으로 LOD를 생성할 수 있습니다.
  • Nanite (나나이트): 언리얼 엔진 5의 Nanite 기술은 매우 높은 폴리곤 수의 메쉬도 효율적으로 렌더링하고 메모리를 관리할 수 있게 해줍니다. 가능한 경우 Nanite를 활성화하여 사용합니다.
  • 폴리곤 수 줄이기: 블렌더, 3ds Max 등 3D 모델링 툴에서 직접 메쉬의 폴리곤 수를 최적화합니다.
  • Material 슬롯 최소화: 한 메쉬에 너무 많은 머티리얼 슬롯을 사용하지 않도록 합니다. 각 슬롯은 추가적인 드로우콜과 렌더링 오버헤드를 발생시킵니다.
  • 본(Bone) 계층 최소화 (스켈레탈 메쉬): 스켈레탈 메쉬의 본 수가 많을수록 메모리와 CPU 부하가 증가합니다. 애니메이션에 필요한 최소한의 본만 사용합니다.

2.3. 렌더 타겟 및 Post Process 최적화

렌더 타겟은 씬을 다른 텍스처에 렌더링할 때 사용되며, 해상도가 높으면 VRAM을 많이 소모합니다.

  • 렌더 타겟 해상도 줄이기: 리플렉션 캡처, 스크린 스페이스 리플렉션, 리플렉션 프로브 등에서 사용되는 렌더 타겟의 해상도를 필요에 맞게 낮춥니다.
  • Post Process Volume 설정:
    • Post Process 효과 중 VRAM을 많이 사용하는 효과(예: Screen Space Global Illumination, Depth of Field, Bloom, Lens Flares)의 강도나 해상도를 조절합니다.
    • 불필요한 Post Process 효과는 비활성화합니다.
  • FXAA / TAA vs. MSAA: 안티앨리어싱 방식에 따라 VRAM 사용량이 다릅니다. TAA(Temporal Anti-Aliasing)는 일반적으로 MSAA(Multisample Anti-Aliasing)보다 VRAM 사용량이 적지만, 고스팅(Ghosting) 등의 아티팩트가 발생할 수 있습니다.
  • 스크린 해상도 낮추기: 궁극적인 방법이지만, 게임 내에서 화면 해상도를 낮추는 옵션을 제공하거나, 에디터에서 Screen Percentage를 조절하여 렌더링 해상도를 낮출 수 있습니다.

3. 기타 최적화 팁

  • Garbage Collection (가비지 컬렉션): 불필요한 오브젝트가 메모리에 남아있지 않도록 가비지 컬렉션이 효율적으로 작동하는지 확인합니다. 특히 동적으로 생성/소멸되는 오브젝트가 많을 때 중요합니다.
  • Asset Manager 사용: 에셋 매니저를 사용하여 리소스를 효율적으로 로드하고 언로드합니다. 더 이상 필요하지 않은 리소스는 명시적으로 언로드하여 VRAM을 확보합니다.
  • 레벨 스트리밍: 대규모 레벨의 경우, 현재 플레이어가 있는 구역만 로드하고 다른 구역은 언로드하여 VRAM 및 메모리 사용량을 최적화합니다.
  • 불필요한 플러그인 비활성화: 프로젝트에 사용하지 않는 플러그인은 비활성화하여 엔진의 메모리 footprint를 줄입니다.
  • 콘솔 명령 활용: 개발 중에는 다양한 stat 명령어를 사용하여 실시간으로 성능과 메모리 사용량을 모니터링합니다. (예: stat GPU, stat RHI, stat memory, stat texturepool)

비디오 메모리 부족은 다양한 원인으로 발생할 수 있으므로, 프로파일링 도구를 사용하여 병목 지점을 정확히 파악하는 것이 가장 중요합니다. 이 가이드라인을 바탕으로 프로젝트의 특정 문제점을 찾아 해결해나가시면 될 것입니다.

 

언리얼 fab에서 에셋을 다운 받아서 사용하는데 비디오메모리 부족이 나는 경우 어떻게 최적화를 시작해야 할까

Fab (이전의 Quixel Megascans 포함)에서 다운로드한 에셋으로 인해 비디오 메모리 부족 문제가 발생했다면, 이는 매우 흔한 시나리오입니다. Fab 에셋은 매우 고품질로 제작되어 기본적으로 높은 해상도의 텍스처와 높은 폴리곤 수의 메쉬를 포함하는 경우가 많기 때문입니다.

최적화를 시작하는 단계는 다음과 같습니다.

0. 문제의 원인 파악 (가장 중요!)

가장 먼저 할 일은 어떤 에셋이 비디오 메모리를 많이 사용하는지, 그리고 왜 부족한지를 정확히 파악하는 것입니다.

  1. 언리얼 인사이트 (Unreal Insights) 사용:
    • 언리얼 에디터에서 프로젝트를 실행하고, UnrealInsights.exe를 실행하여 트레이스 파일을 캡처합니다.
    • Memory Insights 탭에서 LLM (Low-Level Memory Tracker) 데이터를 확인합니다. 특히 STAT_TextureMemory 또는 STAT_MeshMemory와 같은 태그를 중점적으로 보세요. 어떤 텍스처나 메쉬가 가장 많은 VRAM을 차지하는지 알 수 있습니다.
    • 특정 에셋의 이름이나 클래스 이름으로 필터링하여 특정 Fab 에셋이 얼마나 많은 메모리를 사용하는지 분석할 수 있습니다.
  2. memreport -full 콘솔 명령:
    • 에디터에서 플레이하거나 게임을 실행한 후 콘솔(~ 키)을 열고 memreport -full을 입력합니다.
    • 이 명령은 프로젝트의 Saved/Profiling/MemReports 폴더에 .memreport 파일을 생성합니다.
    • 이 파일을 열어보면 RHI(GPU) 메모리 사용량에 대한 상세한 보고서가 있습니다. 특히 "Texture Memory" 섹션에서 해상도별로 사용되는 텍스처 목록과 그 크기를 확인할 수 있습니다.
    • 어떤 텍스처가 비정상적으로 높은 해상도를 사용하고 있는지 쉽게 파악할 수 있습니다. 예를 들어, 작은 오브젝트에 8K 텍스처가 사용되고 있다면 즉시 최적화 대상이 됩니다.
  3. Content Browser에서 Size Map 활용:
    • 의심되는 Fab 에셋(스태틱 메쉬, 텍스처 등)을 콘텐츠 브라우저에서 우클릭하고 Size Map을 선택합니다.
    • 이것은 해당 에셋이 차지하는 디스크 용량과 메모리 사용량을 시각적으로 보여줍니다. 텍스처의 경우 MipMap 수준별 용량도 확인할 수 있습니다.

이 단계에서 어떤 종류의 에셋(텍스처, 메쉬)이, 그리고 구체적으로 어떤 Fab 에셋이 비디오 메모리를 가장 많이 사용하는지 명확하게 파악해야 합니다.

1. 텍스처 최적화 (가장 큰 효과)

Fab 에셋은 보통 4K, 8K 등의 고해상도 텍스처를 포함합니다. 이 부분이 VRAM 부족의 주범인 경우가 많습니다.

  1. 텍스처 해상도 조절 (Maximum Texture Size):
    • 콘텐츠 브라우저에서 VRAM을 많이 사용하는 Fab 텍스처를 찾습니다.
    • 해당 텍스처를 더블 클릭하여 텍스처 에디터를 엽니다.
    • Details 패널에서 Level of Detail 섹션을 찾습니다.
    • Maximum Texture Size 값을 줄입니다.
      • 예시: 8K 텍스처라면 2048 (2K) 또는 1024 (1K)로 줄여봅니다.
      • 해당 텍스처가 화면에서 차지하는 크기를 고려하여 적절한 해상도를 찾습니다. 멀리 있거나 작은 오브젝트에 사용되는 텍스처는 과도하게 높은 해상도를 가질 필요가 없습니다.
    • Tip: 여러 텍스처를 한 번에 선택하여 Property Matrix (오른쪽 클릭 -> Asset Actions -> Bulk Edit via Property Matrix)를 통해 일괄적으로 Maximum Texture Size를 변경할 수 있습니다. 특정 폴더 내의 모든 텍스처를 선택하여 적용하는 식으로 활용하면 편리합니다.
  2. 텍스처 스트리밍 (Texture Streaming):
    • 대부분의 Fab 텍스처는 기본적으로 스트리밍이 활성화되어 있을 것입니다. 하지만 혹시 모를 경우 확인합니다.
    • 텍스처 에셋에서 Never Stream 옵션이 체크되어 있지 않은지 확인합니다. 이 옵션이 체크되어 있으면 해당 텍스처는 항상 최고 해상도로 VRAM에 로드되어 스트리밍의 이점을 누리지 못합니다.
    • 프로젝트 세팅 (Edit -> Project Settings -> Engine -> Rendering -> Textures)에서 Texture Streaming이 활성화되어 있는지 확인하고, 필요하다면 PoolSize를 늘릴 수도 있지만, 이는 VRAM 부족의 근본적인 해결책이 아니라 일시적인 완화책입니다. (텍스처 메모리가 부족하면 스트리밍 풀을 늘리는 것이 아니라, 텍스처 해상도를 낮추는 것이 우선되어야 합니다.)
  3. 압축 포맷 확인:
    • 텍스처 에셋에서 Compression Settings를 확인합니다. 기본적으로 Default로 설정되어 있을 텐데, 이는 언리얼 엔진이 가장 적합한 압축 포맷을 자동으로 선택하는 것입니다.
    • 모바일이나 특정 저사양 플랫폼을 타겟으로 한다면, 보다 압축률이 높은 포맷(예: DXT1 (BC1), ASTC)을 강제로 지정할 수도 있지만, 이는 품질 저하를 동반할 수 있습니다.
  4. 불필요한 MipMap 제거:
    • 일부 텍스처(예: UI, 배경의 단순한 평면)는 MipMap이 필요하지 않을 수 있습니다. 텍스처 에디터에서 Mip Gen Settings를 NoMipmaps로 설정하여 VRAM을 절약할 수 있습니다.

2. 메쉬 최적화

Fab 에셋은 보통 고품질 모델이므로 폴리곤 수가 높습니다.

  1. LOD (Level of Detail) 생성 및 조절:
    • Fab에서 다운로드한 스태틱 메쉬나 스켈레탈 메쉬에 LOD가 적절하게 설정되어 있는지 확인합니다.
    • 메쉬 에디터에서 LOD Settings 섹션을 찾습니다.
    • 자동 LOD 생성(Generate LODs)을 사용하거나, 필요한 경우 외부 3D 툴(Blender, Maya, 3ds Max 등)에서 직접 LOD를 생성하여 가져오는 것을 고려합니다.
    • 각 LOD 레벨의 Screen Size를 적절히 조절하여, 오브젝트가 화면에서 작게 보일 때는 저폴리곤 LOD가 사용되도록 합니다.
    • Tip: Property Matrix를 사용하여 여러 메쉬에 한 번에 LOD 설정을 적용할 수 있습니다.
  2. Nanite (언리얼 엔진 5의 경우):
    • 언리얼 엔진 5를 사용하고 있다면, Fab 메쉬에 Nanite를 활성화합니다. Nanite는 수백만 개의 폴리곤을 효율적으로 처리하고 메모리를 관리하는 데 탁월합니다.
    • 스태틱 메쉬 에디터에서 Details 패널의 Nanite Settings에서 Enable Nanite를 체크합니다.
    • Nanite는 자동으로 마이크로폴리곤을 스트리밍하므로, 고폴리곤 메쉬가 VRAM을 과도하게 차지하는 문제를 줄여줍니다.
    • 하지만 Nanite도 VRAM을 사용하므로, 정말 필요한 메쉬에만 사용하는 것이 좋습니다. 특히 작은 오브젝트나 멀리서 보이는 오브젝트에는 Nanite가 비효율적일 수 있습니다. (오히려 일반 LOD가 더 효율적인 경우도 있습니다.)
  3. 불필요한 메쉬 제거:
    • 씬에 사용되지 않는 Fab 메쉬가 있다면 제거합니다.
    • 너무 많은 수의 작은 Fab 메쉬들이 한 곳에 밀집되어 있지 않은지 확인합니다. 인스턴싱(Instancing)을 통해 드로우콜을 줄일 수 있지만, 각 메쉬의 VRAM 사용량은 그대로입니다.

3. 머티리얼 최적화

Fab 에셋의 머티리얼은 복잡한 노드를 많이 포함하고 있을 수 있습니다.

  1. 머티리얼 복잡도 줄이기:
    • Fab 머티리얼의 노드 그래프가 너무 복잡하지 않은지 확인합니다. 불필요한 연산이나 텍스처 샘플러를 제거합니다.
    • 특히 Material Instance를 사용하여 불필요한 파라미터는 Static Parameter로 설정하고 컴파일 타임에 분기하도록 합니다.
  2. Vertex Painting 활용:
    • 여러 머티리얼을 섞는 대신, 한 머티리얼 내에서 버텍스 페인팅을 활용하여 여러 질감을 표현하면 드로우콜과 머티리얼 사용량을 줄일 수 있습니다.
  3. Opacty Masked vs. Translucent:
    • 나뭇잎처럼 투명한 부분이 있는 에셋의 경우 Masked 머티리얼이 Translucent 머티리얼보다 일반적으로 성능에 더 좋습니다. Fab 에셋이 Translucent를 사용하고 있다면 Masked로 변경할 수 있는지 고려해봅니다. (단, 부드러운 투명도 표현은 포기해야 합니다.)

4. 씬 및 프로젝트 설정 최적화

Fab 에셋 자체 외에 씬의 다른 요소들도 VRAM에 영향을 줍니다.

  1. Post Process Volume 설정:
    • 씬에 있는 Post Process Volume의 설정을 검토합니다. 특히 Bloom, Depth of Field, Screen Space Reflections, Global Illumination (Lumen) 등은 VRAM을 많이 소모할 수 있습니다.
    • 필요 없는 효과는 비활성화하거나, 품질 설정을 낮춥니다.
  2. 레벨 스트리밍 (Level Streaming):
    • 씬이 너무 크고 방대하다면, 레벨 스트리밍을 사용하여 플레이어가 현재 위치한 부분만 로드하고 다른 부분은 언로드하여 VRAM 사용량을 줄입니다.
  3. 렌더 타겟 및 리플렉션 캡처 최적화:
    • 리플렉션 캡처, 스크린 스페이스 리플렉션, 혹은 다른 렌더 타겟의 해상도를 줄입니다. 이들은 씬을 다른 버퍼에 렌더링하므로 VRAM 사용량이 상당할 수 있습니다.
  4. 가상 텍스처링 (Virtual Texturing):
    • 대규모 월드나 매우 고해상도 텍스처를 많이 사용하는 경우, 프로젝트 세팅에서 가상 텍스처링을 활성화하여 필요한 텍셀만 메모리에 로드하도록 합니다. (UE5에서 Nanite와 함께 활용 시 시너지가 좋습니다.)

최적화 워크플로우 제안

  1. 점진적 적용: 모든 최적화를 한 번에 적용하기보다는, 가장 큰 영향을 미칠 것 같은 부분부터 차례대로 적용하고 결과를 확인합니다.
  2. 반복적인 프로파일링: 최적화를 적용할 때마다 memreport나 Unreal Insights를 다시 실행하여 VRAM 사용량이 실제로 줄어들었는지, 그리고 성능에 어떤 영향을 미치는지 확인합니다.
  3. 타겟 플랫폼 고려: 최종 게임이 실행될 플랫폼(PC, 모바일, 콘솔)의 하드웨어 사양을 고려하여 최적화 수준을 결정합니다. 모바일이라면 훨씬 더 공격적인 최적화가 필요할 것입니다.
  4. 원본 보존: Fab 에셋을 수정하기 전에 반드시 복사본을 만들어두거나 버전 관리 시스템을 사용하여 원본을 보존합니다.

Fab 에셋은 고품질을 지향하기 때문에, 기본 설정 그대로 사용하면 VRAM 부족 문제를 겪을 가능성이 높습니다. 따라서 에셋의 세부 설정을 직접 조절하여 프로젝트의 요구 사항에 맞게 "다듬는" 과정이 필수적입니다.

 

언리얼에서 HLOD를 사용해서 최적화가 가능한데 버전 5.0부터는 나나이트가 있는데 꼭 필요한가

HLOD와 Nanite는 언리얼 엔진에서 메쉬 최적화를 위한 강력한 도구이지만, UE5에서 Nanite가 있다고 해서 HLOD가 완전히 불필요해지는 것은 아닙니다. 오히려 상호 보완적인 관계를 가집니다.

각각의 역할과 왜 상호 보완적인지 설명해 드리겠습니다.

1. Nanite (나나이트)

  • 주요 역할: 개별 스태틱 메쉬의 폴리곤 밀도를 무제한으로 높이면서도 성능을 효율적으로 유지하는 데 중점을 둡니다.
    • 작동 방식: 메시를 마이크로 트라이앵글 클러스터로 나누고, 카메라에서 보이는 부분만 필요한 수준의 디테일로 실시간 스트리밍 및 렌더링합니다. 컬링, LOD, 텍스처 스트리밍 등을 자동으로 처리합니다.
    • 장점:
      • 수백만 개의 폴리곤을 가진 고품질 에셋을 쉽게 사용할 수 있습니다.
      • 수동 LOD 생성 및 관리의 필요성을 줄여줍니다.
      • 드로우콜을 효율적으로 관리합니다.
      • 카메라와 가까운 오브젝트의 디테일이 매우 뛰어납니다.
    • 단점/제한 사항:
      • 스태틱 메쉬에만 적용됩니다. (스켈레탈 메쉬, 월드 파티션 스트리밍 볼륨, 트랜스루슨트 머티리얼, 와이어프레임 렌더링 등에는 적용되지 않습니다.)
      • Nanite도 VRAM을 사용하며, 복잡한 씬에서는 VRAM 사용량이 늘어날 수 있습니다.
      • 작은 오브젝트나 매우 멀리 있는 오브젝트에는 Nanite 오버헤드가 LOD보다 클 수 있습니다.
      • 일부 특정 렌더링 기능(예: 커스텀 뎁스, 픽셀 뎁스 오프셋)과 호환되지 않을 수 있습니다.

2. HLOD (Hierarchical Level of Detail)

  • 주요 역할: 멀리 떨어진 수많은 오브젝트들의 렌더링 성능을 최적화하는 데 중점을 둡니다. 개별 메쉬보다는 그룹화된 메쉬(클러스터) 단위로 작동합니다.
    • 작동 방식: 멀리 떨어진 여러 스태틱 메쉬들을 하나의 통합된 메쉬와 텍스처로 자동 병합(Bake)하거나, 하나의 프록시 메쉬로 대체합니다. 이를 통해 드로우콜을 크게 줄이고 VRAM 및 CPU 오버헤드를 감소시킵니다.
    • 장점:
      • 드로우콜 최적화에 매우 효과적입니다. (수많은 작은 오브젝트들이 멀리서 보일 때 하나의 큰 오브젝트로 렌더링)
      • CPU 렌더링 쓰레드의 부하를 줄입니다.
      • 전체적인 씬의 퍼포먼스를 향상시킵니다.
      • 월드 파티션(World Partition) 시스템과 함께 사용될 때 특히 강력합니다. (언리얼 5의 대규모 월드 스트리밍에 필수적인 기능)
    • 단점:
      • Nanite와 달리 LOD의 품질 손실이 있을 수 있습니다 (특히 베이크된 텍스처의 품질).
      • 설정 및 베이킹 프로세스가 필요하며, 결과물을 수동으로 조정해야 할 수도 있습니다.
      • 주로 스태틱 메쉬에 적용됩니다.

Nanite와 HLOD의 상호 보완 관계

Nanite는 "각 오브젝트의 디테일 수준을 조절"하는 데 탁월하고, HLOD는 "멀리 있는 수많은 오브젝트를 묶어서 효율적으로 렌더링"하는 데 탁월합니다.

따라서 UE5에서 Nanite가 있어도 HLOD가 필요한 이유는 다음과 같습니다.

  1. 드로우콜 최적화: Nanite는 개별 메쉬의 드로우콜을 줄이는 데는 효과적이지만, 수백 또는 수천 개의 독립적인 Nanite 메쉬가 멀리 떨어진 곳에 산재해 있을 때는 여전히 많은 드로우콜을 발생시킬 수 있습니다. HLOD는 이 수많은 Nanite 메쉬들을 하나의 덩어리로 묶어 하나의 드로우콜로 처리함으로써 CPU 렌더링 쓰레드의 병목 현상을 해결하는 데 결정적인 역할을 합니다.
  2. 월드 파티션 시스템과의 시너지: UE5의 대규모 월드를 위한 월드 파티션 시스템은 맵을 그리드로 나누어 스트리밍하는데, 이때 HLOD는 각 그리드의 데이터를 효율적으로 요약하고 관리하는 데 필수적입니다. HLOD 없이는 멀리 있는 그리드의 수많은 오브젝트들을 모두 개별 Nanite 메쉬로 처리해야 하므로 성능 문제가 발생합니다.
  3. VRAM 및 성능 최적화: HLOD는 베이킹된 낮은 해상도의 텍스처와 단순화된 메쉬를 사용하므로, 멀리서 볼 때 Nanite 메쉬가 가지는 고유의 VRAM 및 연산 오버헤드를 줄일 수 있습니다. (예: 숲 전체가 Nanite로 구성되어 있다면 엄청난 VRAM을 소모할 수 있지만, HLOD로 처리하면 훨씬 효율적입니다.)
  4. 비-Nanite 오브젝트 처리: HLOD는 Nanite가 적용되지 않는 스켈레탈 메쉬나 다른 유형의 오브젝트(예: 볼류메트릭 클라우드, 파티클 시스템)와 함께 작동하여 씬 전체의 시각적 연속성을 유지하면서도 최적화를 제공합니다.

결론

  • 가까운 거리에 있는 고품질 스태틱 메쉬: Nanite를 사용하는 것이 가장 좋습니다.
  • 멀리 떨어진 수많은 스태틱 메쉬 (특히 월드 파티션 사용하는 대규모 월드): HLOD를 사용하여 드로우콜을 줄이고 CPU 성능을 최적화하는 것이 필수적입니다. HLOD는 Nanite가 적용된 메쉬들도 그룹화하여 더 효율적으로 처리할 수 있습니다.

따라서 언리얼 엔진 5에서 대규모 환경을 만들고 최적의 성능을 목표로 한다면, Nanite와 HLOD를 함께, 그리고 적절한 상황에 맞춰 사용하는 것이 매우 중요합니다. HLOD는 특히 대규모 오픈 월드의 비저빌리티(visibility) 및 성능 최적화에 여전히 핵심적인 역할을 합니다.