지형과 환경 요소 최적화
이전 절들에서 레벨에 지형을 만들고, 조명을 설정하며, 다양한 환경 효과를 추가하는 방법을 배우셨습니다. 이제 여러분의 레벨이 점점 더 사실적이고 풍성해지고 있을 것입니다. 하지만 이 모든 아름다운 시각 효과와 넓은 공간은 필연적으로 컴퓨터의 성능에 부담을 줍니다. 최적화(Optimization) 는 단순히 레벨을 보기 좋게 만드는 것을 넘어, 여러분의 게임이 다양한 기기에서 원활하게 작동하도록 만드는 필수적인 과정입니다. 마치 잘 설계된 도시가 아름다우면서도 효율적인 교통 시스템을 갖추듯, 언리얼 엔진의 지형과 환경 요소를 최적화하여 여러분의 레벨을 더욱 빠르고 안정적으로 만들어 봅시다.
지형(Landscape) 최적화
랜드스케이프는 넓은 영역을 차지하며 많은 버텍스(Vertex)와 텍스처를 사용하므로, 그 자체로 성능에 큰 영향을 미칠 수 있습니다.
랜드스케이프 컴포넌트 및 섹션 관리
랜드스케이프는 컴포넌트(Component) 와 섹션(Section) 단위로 구성됩니다. 이 단위들이 많을수록 랜드스케이프의 해상도와 디테일은 높아지지만, 그만큼 렌더링 부하도 증가합니다.
- 적절한 해상도 선택: '랜드스케이프 모드(Landscape Mode) > Manage 탭'에서 랜드스케이프를 생성할 때, 필요한 만큼만 큰 해상도를 선택하세요. 필요 이상으로 넓거나 미세한 랜드스케이프는 불필요한 성능 저하를 가져옵니다.
- 팁: 플레이어가 직접 밟지 않는 아주 먼 배경 지형은 더 낮은 해상도의 랜드스케이프를 사용하거나, 단순히 스태틱 메시로 만든 배경 산을 배치하는 것이 효율적입니다.
- 컴포넌트 수 최소화: 랜드스케이프 컴포넌트는 엔진의 컬링(Culling) 및 LOD 시스템의 기본 단위입니다. 컴포넌트 수가 너무 많으면 각 컴포넌트를 처리하는 데 추가적인 CPU 오버헤드가 발생할 수 있습니다. 랜드스케이프의 전체 크기 내에서 컴포넌트의 수를 적절히 조절하는 것이 중요합니다.
- 불필요한 부분 제거: '랜드스케이프 모드 > Manage 탭'에서 'Delete' 툴을 사용하여 레벨에서 전혀 사용되지 않는 랜드스케이프 컴포넌트를 삭제하여 렌더링 범위를 줄일 수 있습니다.
랜드스케이프 재질 최적화
랜드스케이프 재질은 여러 레이어(잔디, 흙, 바위 등)를 혼합하기 때문에 일반 오브젝트 재질보다 복잡하고 성능 비용이 높습니다.
- 복잡도 줄이기
- 레이어 수 제한: 필요한 레이어만 사용하고, 한 랜드스케이프에서 너무 많은 레이어를 혼합하는 것을 피하세요. 각 레이어는 추가적인 셰이더 명령을 발생시킵니다.
- 간소화된 텍스처 사용: 랜드스케이프 재질에 사용되는 텍스처는 적절한 해상도와 압축 설정을 적용합니다. (3장 4절 참고)
- 가급적 Material Instance 사용: 마스터 랜드스케이프 재질을 만들고, 색상이나 강도 조절은 Material Instance (재질 인스턴스) 를 통해 파라미터(Parameter)만 변경하도록 합니다. 이는 셰이더 컴파일 시간을 줄이고 성능에 이점을 줍니다.
- World Aligned Texture 활용: 특정 디테일 텍스처를 지형 표면에 반복적으로 투영할 때, UV 매핑 대신 World Aligned Texture 노드를 사용하면 UV 문제가 발생하지 않으면서도 다양한 크기의 오브젝트에 일관된 텍스처를 적용할 수 있습니다.
환경 요소 (조명, 안개, 클라우드) 최적화
레벨의 분위기를 결정하는 조명과 환경 효과는 시각적 품질만큼이나 성능에 민감하게 반응합니다.
조명 모빌리티(Mobility) 설정
조명 액터의 Mobility (모빌리티) 설정은 성능에 직접적인 영향을 미칩니다.
- Static (정적)
- 장점: 런타임에 가장 성능 효율적입니다. 빛과 그림자 정보가 미리 계산되어(베이크되어) 텍스처에 저장됩니다.
- 단점: 런타임에 움직이거나 색상을 변경할 수 없습니다. 빌드 시간이 필요합니다.
- 활용: 움직이지 않는 건축물 내부의 고정된 조명, 배경의 자연광(일부 경우) 등에 사용합니다.
- Stationary (정지)
- 장점: 베이크된 간접광과 실시간 다이내믹 그림자를 제공하여 유연성과 성능 사이의 좋은 균형을 제공합니다. (Directional Light에 적합)
- 단점: 여전히 빌드 시간이 필요하며, Static보다는 성능 비용이 높습니다.
- 활용: 대부분의 주 광원(태양), 고정된 가로등 등.
- Movable (이동 가능)
- 장점: 런타임에 자유롭게 움직이고 모든 속성을 변경할 수 있습니다.
- 단점: 가장 높은 성능을 요구합니다. 모든 빛과 그림자가 실시간으로 계산됩니다.
- 활용: 플레이어의 손전등, 움직이는 차량 헤드라이트, 동적인 낮/밤 시스템의 태양/달 등.
원칙: 가능한 한 'Static' 조명을 많이 사용하고, 정말 필요한 경우에만 'Stationary' 또는 'Movable' 조명을 사용하세요.
그림자 설정 최적화
그림자는 렌더링에서 가장 성능 비용이 높은 부분 중 하나입니다.
- Shadow Resolution (그림자 해상도) 조절: 각 라이트 액터의 디테일 패널에서 그림자 해상도를 조절할 수 있습니다. 중요하지 않은 작은 조명의 그림자 해상도를 낮추거나, 아예 그림자를 끄는 것을 고려합니다.
- Cast Shadows (그림자 드리우기) 비활성화: 중요하지 않은 작은 오브젝트나, 그림자가 거의 눈에 띄지 않는 오브젝트의 그림자 캐스팅을 비활성화하여 드로우 콜(Draw Call)을 줄일 수 있습니다. (액터의 디테일 패널 > Rendering >
Cast Shadows
옵션) - Cull Distance Volume 활용: 특정 액터들이 카메라로부터 멀어지면 렌더링되지 않도록 강제로 컬링(Culling)하는 볼륨을 배치할 수 있습니다. 특히 그림자를 드리우는 오브젝트에 효과적입니다.
안개 및 클라우드 최적화
- Volumetric Fog 주의: 볼류메트릭 안개(Volumetric Fog) 는 시각적으로 뛰어나지만 매우 높은 성능을 요구합니다. 목표 플랫폼의 사양이 충분하지 않다면, 기본 지수형 높이 안개(Exponential Height Fog) 를 사용하는 것을 권장합니다.
- Volumetric Cloud 설정: 볼류메트릭 클라우드(Volumetric Cloud) 액터의 디테일 패널에서
Quality
옵션이나View Distance (시야 거리)
를 조절하여 성능을 최적화할 수 있습니다. 너무 먼 거리까지 고품질의 구름을 렌더링할 필요는 없습니다.
기타 환경 최적화 팁
포스트 프로세스 볼륨 최적화
후처리 볼륨은 화면 전체에 적용되는 효과이므로, 과도한 설정은 성능 저하를 유발할 수 있습니다.
- 필요한 효과만 활성화:
Post Process Volume
의 디테일 패널에서 필요한 효과만 활성화하고, 불필요한 효과는 비활성화하세요. - 품질 조절:
Bloom
,Ambient Occlusion
,Screen Space Reflections
등 고성능을 요구하는 효과들의 품질을 적절히 조절합니다. (예:Intensity
값 낮추기)
컬링(Culling) 및 LOD 그룹 활용
- Occlusion Culling (오클루전 컬링): 카메라에 보이지 않는 오브젝트는 렌더링하지 않는 기능입니다. 언리얼 엔진이 대부분 자동으로 처리하지만, 때로는
Blocking Volume
이나Custom Occlusion Volume
등을 사용하여 수동으로 최적화할 수 있습니다. - LOD 그룹 설정: 모든 스태틱 메시 에셋에 LOD (Level of Detail) 를 적용하여 카메라 거리에 따라 낮은 품질의 메시를 사용하도록 설정합니다. (3장 4절 '3D 모델 최적화' 참고)
- 팁: 특히 반복적으로 사용되는 오브젝트(나무, 바위, 풀 등)는 LOD 설정이 매우 중요합니다.
풀(Foliage) 최적화
풀이나 잔디와 같은 Foliage (폴리지) 는 레벨을 풍성하게 만들지만, 매우 많은 폴리곤과 드로우 콜을 유발할 수 있습니다.
- 밀도 조절: 폴리지 툴에서 풀의 밀도를 너무 높게 설정하지 마세요.
- 컬링 거리 설정: 각 폴리지 타입의 디테일 패널에서
Cull Distance (컬링 거리)
를 설정하여 플레이어에게서 멀어지면 렌더링되지 않도록 합니다. - LOD 적극 활용: 풀 에셋 자체에도 LOD를 적극적으로 적용하고, 가장 낮은 LOD에서는 메시를 아예 비활성화하는 옵션을 사용합니다.
지형과 환경 요소 최적화는 레벨 디자인의 중요한 부분이며, 프로젝트의 최종 품질과 사용성에 큰 영향을 미칩니다. 이 절에서 배운 원칙들을 바탕으로 여러분의 레벨을 구축하면서 항상 성능을 염두에 두는 습관을 들이세요. 주기적인 성능 프로파일링(Profiling)을 통해 병목 현상을 파악하고 개선해 나가는 것이 중요합니다.
이것으로 4장 "레벨 디자인"의 주요 내용을 마칩니다. 이제 여러분은 언리얼 엔진에서 레벨을 만들고, 지형을 조각하며, 조명을 설정하고, 다양한 환경 효과를 추가하고, 심지어 이들을 최적화하는 기본적인 방법까지 익히셨습니다.