UE5의 RVT를 적극적으로 쓰는 편입니다. 개인적인 경험들을 바탕으로 RVT 관련 메모리 관리에 가장 기초적이면서도 필수적인 내용들을 정리해둡니다.
RVT는 크게 두 종류의 메모리를 사용합니다.
- Page Table Memory: Page Table의 메모리. Page Table은 RVT 시스템을 운영할 때 필요한 데이터들이 관리되는 텍스쳐 형태의 저장소입니다.
- Physical Memory (Pool): 실제 로딩되어 렌더링 된 RVT의 Page들이 차지하는 메모리. RVT의 텍스쳐 포멧과 한 Tile의 크기 등을 기준으로 여러 풀로 나뉘어 있습니다.
Tile(타일)과 Page(페이지)
- Tile(타일): Tile은 VT를 구성하는 가상의 단위입니다. VT는 Tile 여러 개를 순서대로 붙여놓은 모양입니다.
- Page(페이지): Physical Memory Pool에 있는 물리적 공간의 단위로 우리가 필요한 렌더링된 정보는 이 Page에 저장됩니다. 새로운 Tile이 화면에 그려질 필요가 생기면 새로운 Page에 필요한 정보가 렌더링되고, 더 이상 빈 Page가 없는 경우 가장 오래 전 화면에 그려진 Tile에 의해 사용된 Page가 자동으로 정리됩니다.
런타임 버추얼 텍스쳐 파일 포멧이 동일한 경우 "Size of each virtual texture tile(각 버추얼 텍스쳐 타일 크기)"를 통일 시켜야 Physical Memory Pool을 공유하여 메모리 낭비를 방지할 수 있습니다.
Physical Memory Pool은 DefaultEngine.ini 혹은 Project Settings에서 텍스쳐 포멧 별로 세팅할 수 있습니다. Pool의 최대 크기를 적절히 조절해 과도한 메모리 사용을 방지해야 합니다.
아래 콘솔 명령어들을 사용하여 RVT 메모리를 추적, 관리할 수 있습니다.
r.VT.DumpPoolUsage: 사용 중인 VT 텍스쳐 포멧을 로그에 출력.
stat virtualtexturing: VT 시스템의 연산량과 Physical Memory Pool의 현황 화면에 출력.
stat virtualtexturememory: VT 시스템에서 사용 중인 모든 메모리들을 화면에 출력.
r.VT.Residency.Show 1: 사용 중인 VT들의 실시간 메모리 사용 현황을 포멧별로 그래프로 출력.
RVT의 텍스쳐 그룹은 퀄리티 레벨별, 디바이스별 LODBias를 주지 않는 게 좋습니다.RVT에 렌더링하는 텍스쳐들의 텍스쳐 그룹이 낮은 퀄리티 레벨로의 전환이나 저사양 디바이스 환경에서 LODBias 값을 0보다 높게 할당하면 결과적으로 RVT에 렌더링된 해상도도 떨어집니다. 이 때 동일 환경에서 RVT의 LODBias 값도 0보다 커지면 추가적으로 최종 렌더 해상도가 더 떨어집니다. 따라서, RVT의 텍스쳐 그룹은 퀄리티 레벨별, 디바이스별 LODBias를 주지 않도록 하는 게 일반 텍스쳐들의 퀄리티 레벨별, 디바이스별 LODBias 세팅 의도를 보존해주는 방법입니다.
RVT 볼륨 크기별로 Scalability Group을 세팅하여 타일 갯수를 조절합니다. Scalability Group은 볼륨에 지정된 RVT의 Tile 갯수에 TileCountBias를 적용합니다. 볼륨의 크기가 클수록 Tile 갯수가 많아야 해상도가 확보됩니다. 즉, 볼륨의 크기가 작다면 Tile 갯수를 줄여도 해상도가 유지됩니다.
엔진에 기본적으로 3개의 그룹(Group 0~2)이 있으며 각 그룹별로 Tile 갯수에 몇의 Bias를 줄지를 DefaultEngine.ini에 기록해두면 됩니다. Bias값이 1 줄어들수록 Tile 갯수는 반씩 줄어듭니다.
(콘솔 명령어로도 제어 가능합니다)디바이스별, 퀄리티 레벨별 세팅도 Config/Windows/WindowsEngine.ini, Config/Defaultscalability.ini 등에서 가능합니다.