본문 바로가기
개발/Unity 자료

Unity Tips) 메모리 최적화 꿀 팁

by 테샤르 2023. 5. 2.

메모리 최적화 꿀 팁

Unity Square에서 Tip으로 소개된 메모리 최적화 꿀 팁과 

작업하면서 경험한 여러가지 경험을 종합해서 정리하는 포스팅이다.

 

<1. 메모리 프로파일러>

빌트인 프로파일러 모듈로, 애플리케이션이 메모리를 사용하는 위치에 대한 기본 정보를 제공합니다.메모리 프로파일러 모듈은 애플리케이션에 할당된 전체 메모리를 나타내는 카운터를 시각화합니다. 메모리 모듈을 사용하여 로드된 오브젝트의 수와 카테고리 별로 해당 오브젝트가 차지하는 메모리 양과 같은 정보를 볼 수 있습니다.

 

반응형

<2. 프레임 디버거 사용하기>

<3. Unity Addressable >

Unity Addressables는 복잡한 라이브 콘텐츠를 전달해야 하는 대규모 제작팀의 요구사항을 보다 효과적으로 지원하기 위한 Unity 에디터 및 런타임 에셋 관리 시스템입니다.Unity Addressables을 활용해 불필요한 에셋의 로드를 방지하는 약한 참조를 도입하여 런타임 메모리를 개선할 수 있습니다.

<4. Audio / Sound 설정>

옵션 설명
Force to Mono 오디오의 스테레오 정보를 없애고 Mono로 만드는 만큼 용량이 줄어듭니다. 특히 모바일에서는 스테레오로 설정할 일이 드물어 추천 드립니다.
읽기 방식(Load type)
권장 압축 형식(Compression Format)
Unity는 하드웨어 가속이 아닌 소프트웨어로 오디오 디코딩을 처리하고 있어 안드로이드/iOS 구분 없이 사용할 수 있는 Vorbis 타입을 권장합니다.
매우 짧은 클립의 경우 ADPCM 포맷을 권장 드립니다.
※ 오디오는 음소거(Mute) 상태여도 메모리에는 존재하고 있어 선택 옵션이 아니라면, 지우는 것을 권장합니다.
추가로 원본의 오디오를 포맷을 변경하는것도 하나의 방법이다.
 

 

< 5. 불필요한 옵션 삭제 >

< Mesh>


Mesh 데이터 관리를 통해 메모리를 최적화할 수 있습니다.


Read / Write Enabled 옵션은 CPU와 GPU메모리 양측에 존재하여 옵션을 OFF하는 것이 좋습니다.

 

 

< Physics >

 

< 6. 압축 포맷 설정 >

압축이 가능한 항목에 대해서는 압축을 진행하자.

플랫폼          
Windows, Linux, macOS RGB RGB 24비트 RGB Compressed DXT1 RGB(A) Compressed BC7 RGB Compressed DXT1
  RGBA RGBA 32비트 RGBA Compressed DXT5 RGB(A) Compressed BC7 RGBA Compressed DXT5
  HDR RGBA Half RGB Compressed BC6H RGB Compressed BC6H RGB Compressed BC6H
WebGL RGB RGB 24비트 RGB Compressed DXT1 RGB Compressed DXT1 RGB Compressed DXT1
  RGBA RGBA 32비트 RGBA Compressed DXT5 RGBA Compressed DXT5 RGBA Compressed DXT5
Android (설정 가능) RGB RGB 24비트 RGBA Compressed ASTC 6x6 블록
RGB Compressed ETC2
RGB Compressed ETC
RGBA Compressed ASTC 4x4 블록
RGB Compressed ETC2
RGB Compressed ETC
RGBA Compressed ASTC 8x8 블록
RGB Compressed ETC2
RGB Compressed ETC
  RGBA RGBA 32비트 RGBA Compressed ASTC 6x6 블록
RGBA Compressed ETC2
RGBA Compressed ASTC 4x4 블록
RGBA Compressed ETC2
RGBA Compressed ASTC 8x8 블록
RGBA Compressed ETC2
iOS (설정 가능) RGB RGB 24비트 RGBA Compressed ASTC 6x6 블록
RGB Compressed PVRTC 4비트
RGBA Compressed ASTC 4x4 블록
RGB Compressed PVRTC 4비트
RGBA Compressed ASTC 8x8 블록
RGB Compressed PVRTC 2비트
  RGBA RGBA 32비트 RGBA Compressed ASTC 6x6 블록
RGBA Compressed PVRTC 4비트
RGBA Compressed ASTC 4x4 블록
RGBA Compressed PVRTC 4비트
RGBA Compressed ASTC 8x8 블록
RGBA Compressed PVRTC 2비트
tvOS RGB RGB 24비트 RGBA Compressed ASTC 6x6 블록 RGBA Compressed ASTC 4x4 블록 RGBA Compressed ASTC 8x8 블록
  RGBA RGBA 32비트 RGBA Compressed ASTC 6x6 블록 RGBA Compressed ASTC 4x4 블록 RGBA Compressed ASTC 8x8 블록
Default RGBA RGBA 32비트 RGBA 16비트 RGBA 16비트 RGBA 16비트

 

모바일의 경우 공통적으로 사용가능한(Android / iOS) ASTC 사용

Adaptive Scalable Texture Compression
손실 블록 기반 텍스쳐 압축 알고리즘
블록 크기를 설정하여 용량 및 품질을 유연하게 설정할 수 있다.
블록 크기가 작을수록 용량이 크고, 품질이 좋아진다.

일반적으로 ETC 포맷보다 품질이 더 좋고, 압축 시간이 더 오래 걸린다.
안드로이드, iOS 모두 지원한다.
구형 기종에서는 지원하지 않을 수 있으므로 주의해야 한다.

최근 들어 모바일에서 ASTC를 사용하는 경우가 많다.

Unity 플랫폼별 권장 기본 지원 텍스처 압축 포맷 : [링크]

 

플랫폼별 권장, 기본 및 지원 텍스처 압축 포맷 - Unity 매뉴얼

이 페이지는 다음에 관한 정보를 제공합니다.

docs.unity3d.com

 

< 7. TextMesh Pro >

 

Unity 버전이 올라가면 기존의 Text는 Legecy 로 포함되어서 결국 TextMeshPro(TMP)를 사용해야 한다.

 

특히 한글은 초성+중성+종성 조합 방식으로 11,000자가 넘는 글자를 텍스트 아틀라스와 텍스처로 제작한다면 메모리가 커질 수 밖에 없습니다. 메모리 최적화를 위해 사용 시 여러 테스트를 통해 제작하는 것을 권장합니다.

 

< 8. UI 최적화 >

 

UI 최적화 설명
Canvas 분할 하기 UI의 드로우 콜 및 배칭은 캔버스 단위로 발생한다.
만약 하나의 UI에 변경사항이 발생하면 캔버스 전체가 다시 그려진다.
따라서 변경이 자주 발생하는 UI는 캔버스를 따로 분리하는 것이 좋다.
보이지 않는 UI 비활성화하기 UI를 화면 영역 밖으로 옮기거나, 투명도를 0으로 설정하는 경우가 있다.
이렇게 하면 보이지 않을 뿐이지, 모두 연산에 포함된다.
따라서 안보이게 하려면 비활성화하는 것이 좋다.
그래픽 레이캐스터 제거하기


Graphic Raycaster 컴포넌트는 해당 게임오브젝트의 모든 자식 UI 오브젝트에 대해 그래픽 레이캐스트 연산을 수행한다.
만약 해당 캔버스에 이미지와 텍스트처럼 사용자 입력이 필요 없는 UI만 존재한다면, 제거하는 것이 좋다.
레이캐스트 타겟 설정 해제하기

UnityEngine.UI.Graphic을 상속받는 UGUI 컴포넌트들에는 raycastTarget 프로퍼티가 존재한다.
인스펙터에서 체크/해제할 수 있다.
체크된 경우 그래픽 레이캐스터의 연산 대상이 되므로, 사용자 입력을 받지 않는 UI의 경우에는 해제하는 것이 좋다.
재사용하는 오브젝트는 풀링 사용하기  간단하게 다 사용한 오브젝트를 다시 사용하는 개념이다. 
Unity ObjectPool : [링크]
과도한 레이러링 주의 다수의 UI 요소를 레이어링하면(예: 카드 시합 게임에서 쌓여 있는 카드) 오버드로우가 발생합니다. 코드를 커스터마이즈하여 런타임에 레이어링된 요소를 병합하여 요소나 배치(batch)의 수를 줄이세요.

 

< 9. Scene 전환을 통한 Loading  및 Scene Additive , DontDestory 사용하기 >

 

Scene 전환 시 기존 Scene A 의 데이터가 남아있는 상황에서 추가적으로 Scene B의 데이터를 로드할 경우 순간적으로 메모리에 과부하가 발생할 수 있습니다.

이렇게 자주 씬을 로드해야하는 경우에는 차라리 Scene Additive 옵션을 사용하거나

DontDestroyOnLoad로 삭제를 안하는 방법도 고려해 봐야한다.

결국 Scene 을 삭제하고 로드하는 과정에서 부하가 많이 생기기 때문이다.

Additive Scene DontDestroyOnLoad

 

 

 

Unity 모바일 게임 성능 최적화: 물리,UI 오디오 설정에 대한 전문가의 팁 : [링크]

 

모바일 게임 성능 최적화: 물리, UI, 오디오 설정에 대한 전문가 팁 | Unity Blog

MovePosition 또는 AddForce와 같은 클래스 메서드를 사용하면 Rididbody 오브젝트를 이동할 수 있습니다. 트랜스폼 컴포넌트를 직접 변환하면 물리 월드에서 다시 계산하게 되어, 복잡한 씬의 경우 리소

blog.unity.com

Unity Tips: 메모리 최적화 꿀팁 : [링크]

 

Unity Square

성능이 한정된 기기에서 실행되는 애플리케이션의 충돌을 방지하려면 메모리 최적화가 반드시

unitysquare.co.kr

 

 

[Unity -Top Paid Package]

[Unity -Top Free Package]

[Unity -New Asset Package]

 

★★★★★

 

반응형

댓글