Unreal Engine 프로젝트 최적화
Unreal Engine 프로파일링 2 : 로딩 시간
kimswong
2023. 2. 19. 20:17
반응형
Load times are generally proportional to how much memory is being loaded.
레벨 로딩 타임에 대한 에픽 게임즈의 공식 답변입니다. 로딩 시간은 '얼마나 많은 메모리를 불러오냐'에 비례합니다. 말 그대로 해당 레벨을 열 때 불러와야 하는 데이터 크기가 크다면 로딩 시간이 오래 걸립니다.
엔진 프로젝트에서 많은 데이터 포션을 차지하는 대표적인 애셋들은 아래와 같습니다.
- 빌드된 라이트맵 데이터
- 텍스처 파일
- 하이 폴리곤 메시
- 리플렉션 캡처 데이터
한 프로덕트의 로딩 시간 최적화 작업을 진행할 때, 이미 최적화되지 않은 수 십 개의 프로젝트가 배포된 상태였습니다. 모든 프로젝트의 애셋을 프로파일링하고 문제 되는 애셋을 수정하기에는 너무 많은 시간과 비용이 드는 상황이었습니다. 그런데 해당 프로덕트의 특징이 모든 프로젝트를 현장에서 자사의 하드웨어로 시연한다는 것에서 착안해, 현장 기기의 저장장치를 하드디스크에서 SSD로 교체해야 한다는 보고서를 올렸습니다. 일반적인 프로덕트에서는 불가능한 방법이겠지만, 굉장히 효과적인 해결책이었고 40초 내외의 로딩 시간을 7초 이내로 줄일 수 있었습니다. 문제와 상황을 잘 인식한다면 비용적으로 더 나은 최적화 방법을 도출할 수 있습니다.
1. 메모리 크기 진단 방법
사이즈 맵
- 콘텐츠 브라우저에서 레벨을 우클릭해 '사이즈맵'을 열면 어떤 요소가 디스크와 메모리를 차지하는지 확인할 수 있습니다.
- 데이터 크기를 시각적으로 정리해 주기 때문에 간편한 방법입니다.
- 라이팅 빌드 데이터와 리플렉션 캡처 데이터는 BuildData 하나로 통합되어 보이며, 텍스처와 메쉬 상관없이 메모리 크기를 기준으로 나타납니다.
- 종속된 요소들이 있을 경우 더블클릭 하면 세부 요소들을 확인할 수 있습니다.
통계
- 상단 메뉴 바에서 창 - 통계를 열면 현재 레벨에 로드되는 애셋들의 상세 정보를 확인할 수 있습니다.
- 메쉬의 경우 트라이앵글 개수, 라이트맵 크기도 확인할 수 있으며, 텍스쳐는 포맷과 해상도까지 상세하게 확인할 수 있습니다.
- 창 좌 상단의 드롭다운 메뉴로 텍스처,라이트맵,메쉬 중 어떤 요소의 통계를 볼 지 정할 수 있습니다.
- 우 상단의 드롭다운 메뉴에서 현재 선택한 레벨/오브젝트의 통계만 볼 것인지, 퍼시스턴트 레벨 아래 모든 오브젝트의 통계를 볼 것인지 정할 수 있습니다.
- 목록에서 애셋을 선택하면 콘텐츠 브라우저 창에서 해당 애셋의 위치가 바로 나타납니다.
2. 로딩 시간 개선 방법
프로파일링으로 찾아낸 문제되는 애셋을 다시 제작하는 것 외에 사용할 수 있는 최적화 방법을 몇 가지 소개해보겠습니다.
라이트맵 밀도
- 최적화 뷰모드 - 라이트맵 밀도(단축키 Alt + 0)로 메시들의 라이트맵 밀도를 확인할 수 있습니다.
- 붉은색에 가까울 수록 해당 메시의 라이트맵 밀도가 높다는 것이며, 더 많은 라이트맵 데이터를 차지하게 됩니다.
- 유니티에서 해당 오브젝트의 라이트맵 비율을 조정할 수 있듯이, 디테일 창 - 라이팅 - Overridden Light Map Resolusion 값으로 라이트맵 밀도를 조정할 수 있습니다.
- 중요하지 않은 오브젝트의 라이트맵 밀도를 떨어뜨려 라이트맵 데이터 낭비를 줄일 수 있습니다.
- 월드 세팅의 라이트매스 설정으로 라이팅 빌드의 설정을 조정할 수 있습니다.
- 스태틱 라이팅 레벨 스케일이 작아질수록 라이팅 빌드 시간은 오래 걸리고 데이터는 커집니다.
- 프로젝트에 따라 스케일 값과 기타 라이팅 빌드 퀄리티 값을 조정해 적정 라이트맵 데이터를 만들어낼 수 있습니다.
텍스처 최대 해상도 조정
- 중요도가 낮은 텍스처를 다시 제작할 필요 없이 엔진 상에서 해상도를 수정할 수 있습니다.
- 텍스처의 디테일 창에서 Maximum Texture Size를 조정해 처음 임포트된 해상도보다 낮은 해상도 상태로 만들 수 있습니다.
텍스처 패킹
- 유니티 엔진에서 디테일 맵을 만드는 것과 같은 원리입니다.
- Metallic map, Mask map 처럼 흑백만 필요한 맵의 경우 한 텍스처의 RGBA 각 채널에 패킹해 하나의 텍스처로 만드는 방법입니다.
- 약간의 수고로 큰 데이터 절약을 할 수 있어 거의 필수적으로 사용되는 방법입니다.
리플렉션 캡처 데이터
- 프로젝트 세팅 - 엔진 - 렌더링 에서 리플렉션 설정을 통해 리플렉션 캡처 데이터의 크기를 줄일 수 있습니다.
패키징 설정
Create compressed cooked packages (압축 쿠킹 패키지 생성)
Share Material Shader Code (머티리얼 셰이더 코드 공유)
Share Material Native Libraries (머티리얼 네이티브 라이브러리 공유)
- 위 세 가지 옵션을 켜고 패키징을 하는 방법입니다.
- 언리얼 엔진 문서에는 프로젝트에 따라 큰 차이가 나는 경우도 있다고 설명하는데, 제가 진행했던 프로젝트들에서는 의미 있는 변화는 없었습니다. 아마 정말 작은 크기의 프로젝트에 해당한다고 추측해 봅니다.
반응형