텍스처 메모리 관리
Texture Streaming과 Virtual Textures로 VRAM을 효율적으로 사용합니다
Texture Streaming 시스템
동적 해상도 조절
텍스처 스트리밍은 각 텍스처의 해상도를 동적으로 증가/감소시켜 가용 메모리를 효과적으로 관리합니다.
작동 원리
- 월드 뷰에서 각 텍스처의 텍셀 월드 크기 수집
- 뷰포인트 기준 좋은 텍셀/픽셀 비율 계산
- 가시성 등 추가 정보로 이상적인 해상도 결정
- 스트리밍 메모리 풀 예산 내에서 품질 조정
# 스트리밍 메트릭 실시간 확인
stat Streaming
# 출력 정보
# - Texture Pool Size: 할당된 텍스처 풀 크기
# - Streaming Textures: 현재 스트리밍 중인 텍스처 수
# - Over Budget: 예산 초과량
VRAM 풀 설정
플랫폼별 텍스처 예산
[TextureStreaming]
# GPU VRAM의 몇 %를 텍스처 풀로 사용할지
PoolSizeVRAMPercentage=50
# 또는 절대값 설정 (MB)
# r.Streaming.PoolSize=2048
텍스처 해상도 최적화
멀리 있는 오브젝트의 텍스처는 화면에서 작게 보이므로 낮은 해상도로도 충분합니다. LOD별로 다른 텍스처 해상도를 사용하세요.
Virtual Textures
극단적인 메모리 절약
Virtual Textures (VT)는 필요한 타일만 로드하여 극단적인 메모리 절약이 가능합니다.
Streaming Virtual Textures (SVT)
디스크에서 필요한 타일만 스트리밍. 대형 텍스처에 효과적
Runtime Virtual Textures (RVT)
런타임에 생성. 랜드스케이프 블렌딩, 데칼 등에 사용
# Project Settings > Engine > Rendering
Enable Virtual Texture Support: True
# 텍스처 에셋 설정
Virtual Texture Streaming: True
텍스처 압축과 포맷 전략
플랫폼별 최적 텍스처 포맷
텍스처 포맷 선택은 VRAM 사용량에 직접적인 영향을 미칩니다. 용도에 맞는 압축 포맷을 사용하면 품질 손실 없이 메모리를 대폭 절약할 수 있습니다.
| 포맷 | 용도 | 압축비 |
|---|---|---|
| BC1 (DXT1) | 알파 없는 디퓨즈 | 6:1 |
| BC3 (DXT5) | 알파 있는 텍스처 | 4:1 |
| BC5 | 노멀맵 | 4:1 |
| BC7 | 고품질 (UI, 얼굴) | 3:1 |
| ASTC | 모바일 범용 | 가변 |
// C++에서 텍스처 LOD Bias 설정
void AMyActor::OptimizeTextures()
{
UTexture2D* Texture = LoadObject<UTexture2D>(
nullptr, TEXT("/Game/Textures/MyTexture"));
if (Texture)
{
// LOD Bias로 실제 로드 해상도 제한
Texture->LODBias = 1; // Mip 1단계 내려서 로드
Texture->UpdateResource();
}
}
// 콘솔 명령으로 텍스처 그룹별 MaxLODSize 제한
// r.Streaming.MaxEffectiveScreenSize=0 (제한 해제)
TextureGroup을 잘 분류하면 그룹별로 MaxLODSize와 LODBias를 일괄 제어할 수 있습니다. World, Character, UI, Effects 등 용도별로 그룹을 나누세요.
핵심 요약
- Texture Streaming: 거리/가시성 기반 동적 해상도 조절
- stat Streaming: 텍스처 풀 사용량 모니터링
- 해상도 감소: 4K -> 2K로 메모리 4배 절약
- Virtual Textures: 필요한 타일만 로드
- BC 압축 포맷: 용도별 최적 포맷 선택으로 VRAM 절약
- RVT: 랜드스케이프, 데칼 블렌딩에 활용
다음 강의에서는 메모리 버짓 설계와 플랫폼별 메모리 배분 전략을 다룹니다.
도전 과제
배운 내용을 직접 실습해보세요
프로젝트에서 stat Streaming 명령어를 실행하여 텍스처 풀 사용량을 확인하세요. Over Budget 상태인 경우 가장 큰 텍스처 5개를 식별하고 해상도를 한 단계 내려 메모리 절약량을 측정합니다.
랜드스케이프에 Runtime Virtual Texture(RVT)를 설정하세요. RVT Volume을 배치하고 머티리얼에서 Runtime Virtual Texture Output 노드를 연결하여 레이어 블렌딩 품질을 유지하면서 메모리를 절약합니다.
TextureGroup별 MaxLODSize를 설정하여 월드 텍스처는 2048, UI 텍스처는 1024, 이펙트 텍스처는 512로 제한하는 플랫폼별 DeviceProfile을 구성하세요. VRAM 총 사용량이 2GB 이하가 되도록 최적화합니다.