✍️ 개요
Unity에서는 빌드 용량의 대부분은 Texture가 차지합니다.
또한, 게임을 플레이하면서 메모리의 대부분을 차지하기에 최적화가 중요합니다.
그래서 유니티는 Texture을 효율적으로 처리하기 위해 Sprite Atlas를 사용합니다.
📌 Sprite Atlas란?
Sprite Atlas : 여러 개의 Texture를 단일 Texture로 결합하는 에셋
위 사진을 살펴보면 3개의 Texture을 살펴볼 수 있습니다.
- 보물 상자 (159 * 150 크기)
- 보물 더미 (87 * 67 크기)
- 보물 한줌 (61 * 41 크기)
그리고 이 3개를 하나로 묶어 256 * 256 크기의 Sprite Atlas를 만들었습니다.
그런데 Sprite Atlas을 굳이 생성하고 사용하는 이유는 뭘까요?
📌 Sprite Atlas을 사용하는 이유
1. 메모리 최적화
Texture을 GPU에 전달할 때, 원본 이미지 크기가 아닌 Power of Two(2의 제곱)으로 리사이즈되어 전달됩니다.
따라서 다음과 같은 크기로 리사이즈되어 GPU로 보내집니다.
Sprite Atlas를 사용하지 않은 경우
- 보물 상자 (159 * 150 크기) => 256 * 256 크기
- 보물 더미 (87 * 67 크기) => 128 * 128 크기
- 보물 한줌 (61 * 41 크기) => 64 * 64 크기
Sprite Atlas를 사용한 경우
- Sprite Atlas(3개의 Texture 병합) => 256 * 256 크기
즉, Sprite Altas을 사용하면 메모리 사용량을 줄일 수 있습니다.
2. Draw Call 절감
Draw Call은 CPU가 GPU에게 렌더링을 요청하는 작업입니다.
이 작업은 비용이 비싸기 때문에 요청이 많아지면 CPU 병목 문제가 발생할 수 있습니다.
Sprite Atlas를 사용하지 않은 경우
- Draw Call 3회 요청
Sprite Atlas를 사용한 경우
- Draw Call 1회 요청
만약 32 * 32 Icon 100개를 각각 사용하면 Draw Call이 무려 100회로 늘어납니다.
하지만 Sprite Atlas을 사용하면 단 1회로 최적화할 수 있습니다.
⚠️ 주의
그렇다고 항상 Sprite Atlas로 묶는 것이 정답은 아닙니다.
만약 Sprite Atlas에 수많은 32 * 32 Icon을 100개를 묶어 512 * 512 Sprite Atlas를 만들었다고 가정하겠습니다.
이때 설계를 잘못하여 Icon 중 하나가 동시에 사용되지 못하는 상황이 나타났을 때,
Draw Call이 증가하며 512 * 512 Sprite Atlas가 여러번 넘어갈 수 있기 때문입니다.
(Sprite 1개를 사용하더라도 Sprite Atlas 전체가 Draw Call에 담기기 때문)
이러면 오히려 성능이 떨어질 수 있습니다.
따라서 Draw Call이 동시에 일어날 수 있는 상황인지 체크하며 Sprite Atlas로 묶어야 합니다.
📌 Sprite Atlas 사용 방법
이제 Sprite Atlas을 활용하는 방법에 대해서 알아보겠습니다.
Sprite Atlas는 효율적으로 활용하기 위해선 동시에 사용되는 Sprites끼리 묶는 것이 중요합니다.
위 광물들은 스테이지 레벨에 따라 등장하기 때문에 다음과 같이 나눌 수 있습니다.
[ 스테이지 별로 Jem Sprite Atlas 나누기 ]
- 스테이지 01 : Jem 1 ~ 4
- 스테이지 02 : Jem 5 ~ 9
- 스테이지 03 : Jem 10 ~ 15
- ...
이렇게 나눈 이유는 동시에 존재할 수 있는 광물들이 스테이지에 따라 결정되기 때문입니다.
이것이 Sprite Atlas를 나누는 기준이 되는 것입니다.
만약 단순히 하나의 Sprite Atlas로 모두 묶는다면 스테이지 1의 광물을 그리기 위해 헤비 유저들이 존재하는 스테이지의 광물까지 모두 Draw Call에 담기기 때문에 오히려 성능이 떨어집니다.
Sprite Atlas는 [ Asset 빈 공간 우클릭 ] - [ 2D ] - [ Sprite Atlas ] 을 선택하여 생성할 수 있습니다.
위 사진을 보시면 스테이지 별로 각각의 Sprite Atlas로 나눈 것을 볼 수 있습니다.
Packing을 위한 Texture을 등록하여 저장하면 끝입니다.
Packing은 Sprite 뿐만 아니라 폴더를 등록하여 수행할 수 있습니다.
대신 폴더 내 존재하는 모든 Texture가 등록된다는 점을 인지하세요.
위 Packed Texture을 살펴보시면 512 x 1024 크기임을 확인할 수 있습니다.
이것은 앞서 말씀드린 Power of Two에 기반하여 GPU에 Texture가 전송되기 때문입니다.
📝 정리
Sprite Atlas는 여러 Texture을 묶어 하나의 Texture로 만든 에셋입니다.
Sprite Atlas을 활용하면 메모리를 최적화하고 Draw Call 비용을 줄일 수 있습니다.
하지만 동시에 Draw Call이 호출되어야 효과를 볼 수 있기 때문에 설계가 중요합니다.
'유니티(Unity) > 기능 구현' 카테고리의 다른 글
[Unity 기능] 커스텀 패키지 제작하기 (0) | 2024.12.20 |
---|---|
[Unity 기능] 9-Slicing Sprite 제작 (1) | 2024.12.07 |
[기능] GetComponent 최적화 (CachedMonobehaviour.cs) (1) | 2024.11.11 |