본문 바로가기
개발 (Game)/Unity

[Unity] 메모리 최적화를 위한 에셋 관리

by 진현개발일기 2024. 9. 29.

[영상]

https://www.youtube.com/watch?v=52ehLUfk3DQ&list=PL7g8Lh8G4gEfPhXO06haByx6KNzCrEoXR&index=10

 

[정리]

 

[1. 오디오]

- 모바일 같은 경우 Force To Mono를 활성화하는 것을 권장. 왼쪽 오른쪽 구분해서 사운드를 듣는 경우는 별로 없으니
- Decompress On Load는 말 그대로 메모리이 올려놓는거니 권장하지 않음.
짧은 사운드(<1mb)는 Compress On Load를 사용하고 배경음악 같이 타이밍이 중요하지 않으며 메모리가 큰 사운드는 Streaming을 사용하길 권장.
 - Compression Format은 엄청 짧으면 ADCPM을 그 외 웬만하면 Vorbis 권장. IOS는 MP3를 하드웨어 레벨에서 디코딩하는데 유니티 자체에서는 하드웨어 레벨에서 디코딩 하지않기 때문에 IOS의 이점을 이용할 수 없음.
- Mute인 상태에서도 메모리에 올라가있음. 그러므로 배경음악이 여러 개인 상태에서는 전부 메모리에 올려놓고 사용하지 말고, 그때 그때 필요한 리소스를 메모리에 로드하여 사용하는 것을 권장.
 

[2. Mesh]

- Mesh Compression 옵션은 저장 용량에 영향이 가는 것이고 메모리와는 무관하다.
- Read/Write Enabled이 활성화된다면, 런타임 중에 API를 활용해 메시의 정보를 변경하고 렌더링 해야하므로 CPU메모리, GPU메모리 두 곳에 데이터가 복제되어 적재된다. 그러므로 비활성화 해야함.

[3.Shader Variants]

- 그래픽스 API 종류마다 사용되는 컴파일 바이너리가 다르기 때문에 쉐이더 베리언츠를 줄여 메모리 최적화 및 Complexity를 줄이기 위해서는 Player Settings에서 타겟중인 Grapics API를 지정해주거나 URP의 Shader Stripping 내 설정을 바꿔주면된다.
  * 이는 런타임 메모리보단 패키지 사이즈와 연관이 되는 옵션이다.

 

- 쉐이더 관련 메모리 프로파일링 할때는 유니티 에디터에서 말고 실제 핸드폰에 연결해서 해야함. 동작 방식이 다름 

 

- URP에셋에서 사용하지 않는 기능들은 그냥 꺼주는게 좋다. URP Feature에 따라서도 쉐이더의  variants가 파생될 수 있다.

* 물론 shader variants가 무조건 나쁜 것은 아니다. 여러 가지 쉐이더를 런타임에 교체하면서 렌더링 해줘야한다면, 프레임 hiccup현상 (툭툭 튀는 것)을 방지하기 위해 미리 로드를 해놓고 사용해야하는데 그렇게 된다면 그만큼 메모리를 선점하기 때문에 트레이드 오프라고 생각하면 됨.

 

[4. Text Mesh Pro]

Text Mesh Pro의 기본적인 원리는 글자들을 미리 만들어놓고 아틀라스로 묶은 뒤 사용할 때 글자를 가져와 렌더링 하는 방식이다. 그러므로 지원하는 글자가 많다면, 특히 한글, 그만큼 메모리를 많이 차지하기 때문에 사내에서 정책을 정해 어느 정도 까지 지원을 할지 결정해야 한다.

(ex. 사람들이 잘 쓰지 않는 쀓,꿺,빦 같은 글자도 지원을 해야하는지를 의미함)

 

[5. Texture]

- Reflection Probe 같은 경우 하나의 정육면체 텍스쳐로 이루어져있다. 과도하게 사용할 경우 메모리에 큰 영향을 미친다.

- 텍스처 같은 경우 타겟 플랫폼에 따른 적절한 컴프레션 포맷을 사용해야하고, 불필요한 경우, 텍스처 또한 Read/Write Enabled를 해제 해줘야 한다. 옵션이 활성화 되어있으면 CPU/GPU 메모리 양쪽에 존재하게 된다.

* 만약 텍스처 포맷이 하드웨어와 호환되지 않는다면, 텍스처 원본이 생으로 메모리에 올라가게 된다.
* 예로 8MB의 텍스처가 적절히 압축이 되었다면 1MB로 줄일 수 있지만, 포맷을 잘못 설정할 경우 원본 사이즈 그대로 메모리에 올라간다.

 

- 모바일은 ASTC를 사용해라. 옛날에는 AOS, IOS에 따라 ETC2, PVRTC를 별도로 지정해줬는데 비교적 최근에 나온 ASTC는 자동 적용해줄 뿐더러 성능이 좋음. (4x4는 원본과 거의 다를게 없음)

* 하지만 옛날 폰에서는 지원이 안되는 경우도 있다. 그럴 경우에는 원본 텍스처를 그대로 올리기 때문에 메모리가 터질 수 있다. 그러므로 타겟 시장에 맞춰 ASTC를 사용할지 결정 해야햔다.

 

- ASTC는 POT뿐만 아니라 NPOT도 지원이 된다. 하지만 작업을 하다보면 POT를 쓰게 될 수 밖에 없다.


* 이유
(1) 3D게임은 Mipmap을 사용해야함. 
(2) UI 또한 최적화를 위해 Sprite Atlas를 사용하는데 아틀라스는 POT만 지원한다.

728x90