유니티 최적화 : 스프라이트 아트라스 (Sprite Atlas)

스프라이트 아틀라스

드로우콜을 최적화 하기 위해서 작은 이미지들을 하나의 이미지로 모으는 기능이다.

유니티 내에 내장되어있으며, 손쉽게 적용 가능하다.

 

왜 하나로 모으는게 최적화라는 걸까?

두 가지 이유가 있다.

 

1. ETC, PVRTC 텍스쳐 포멧의 POT (Power of two) 문제 

 - ETC와 PVRTC 텍스쳐는 이미지의 사이즈가 2의 승수일 때만 압축이 가능하다. 2의 승수가 아니면 압축을 하지 못해 무압축 이미지가 되어버린다. 때문에 POT 사이즈의 틀 안에 작은 이미지들을 담아서 압축을 하는 것.

 - 아래는 그 예시이다. 609x1050 의 픽셀수가 훨씬 적은데도 1024x1024 이미지보다 용량을 2배이상 차지하는 것을 확인할 수 있다. (무압축 RGBA8이 사용된 것이 보인다.)

 - 최근 널리 사용되고있는 차세대 포멧 ASTC는 이러한 제약을 받지않는다.

 

2. 드로우콜 줄이기 (이미지를 불러오는 횟수)

 - 드로우콜은 간단하게 말하면 정보들을 불러와서 그리는 횟수를 의미한다. 적으면 적을 수록 성능적으로 유리한데, 그래픽 버퍼에 그릴 오브젝트의 정보를 담아놓고 그리는 방식이라 다음에 그리는 오브젝트가 앞서 그린 오브젝트와 같은 정보를 사용한다면 다시 불러올 필요가 없으니 정보를 불러오는 연산을 생략 가능하다. 

 - 하나의 이미지에 담아놨으니, 그 이미지를 부르고 난 뒤에는 부분적으로 잘라서 사용하기 때문에 드로우콜이 줄어드는 것.

 

 

극한의 최적화 MeshType : Tight

 - 각 스프라이트의 임포트 설정에는 MeshType이라는 것을 설정할 수 있다. 기본적으로는 FullRect이며, Tight 로 바꿀 수 있다.

 - FullRect는 이미지의 투명한 부분이라도 다른 이미지에게 공간을 양보하지 않는다.

 - Tight는 이미지의 투명한 부분에 다른 이미지가 패킹될 수 있게 한다.

 

당연히 설명만보면 Tight가 좋아보이지만, 다음과 같은 문제점이 있다.

 

 

TIght Packing의 사이드이펙트 

재생을 누르지 않았을 때는 정상적이지만, 재생을 누르자 오른쪽 그림과 같이 스프라이트들이 겹쳐서 보인다.

이유는 스프라이트 Tight Packing을 할때 아래와 같이 캐릭터의 스프라이트영역에 아이콘스프라이트가 존재하기 때문에, 캐릭터를 그릴때 같이 그려지게 된 것.

 

Outline을 설정하여 해결하기 

해당 사이드 이펙트는 스프라이트 Outline을 설정하여 투명한 부분을 그리지 않게 하면 해결 가능하다.

자세한 내용은 다른글을 참조.

2021.07.18 - [Unity/최적화] - 유니티 최적화 : 2D 스프라이트 최적화

 

 

댓글

Designed by JB FACTORY