텍스처를 합치는 것이 곧 배칭을 합치는 것
스프라이트 아틀라스는 여러 스프라이트를 하나의 물리적 텍스처로 병합합니다. 보통 “메모리를 아끼려고 쓴다” 고 알려져 있는데, 실무에서 체감이 큰 쪽은 다른 데 있습니다.
텍스처가 머티리얼 상태의 일부라는 것을 앞에서 봤습니다. 그러니 텍스처를 합치면 상태가 합쳐지고, 상태가 합쳐지면 배치가 이어집니다.
슈팅 게임에서 재 본 예
비행기 여러 종류, 총알 여러 종류, 그림자가 각각 다른 텍스처를 쓰고 있는 상태였습니다.
- 적용 전: 비행기 종류별로, 총알 종류별로, 그림자별로 드로우 콜이 갈렸습니다. 같은 종류끼리만 겨우 이어졌습니다
- 적용 후: 아틀라스 4장으로 묶으니 드로우 콜 4회 로 정리됐습니다. 서로 다른 종류의 비행기가 한 번에 그려집니다
숫자가 극적으로 보이지만 원리는 단순합니다. 텍스처 바인딩이 4번밖에 안 일어나니 상태 변경도 4번뿐입니다.
메모리도 줄지만 이유가 다르다
스프라이트는 사각형이 아닌 경우가 많고, 남는 자리는 투명입니다. 그리고 투명한 영역도 메모리에는 그대로 올라갑니다. 알파 값이 0일 뿐 픽셀은 픽셀입니다.
아틀라스로 묶으면서 Tight Packing 을 켜면 그 여백에 다른 스프라이트가 들어갑니다. 실제로 쓰는 픽셀의 비율이 올라가고, 그만큼 메모리와 빌드 용량이 같이 줄어듭니다.
다만 여기에는 한계가 있습니다. 스프라이트가 거의 꽉 찬 사각형이면 아낄 여백이 애초에 없습니다. 메모리를 노리고 아틀라스를 쓰는 것이라면 먼저 여백이 얼마나 되는지 봐야 합니다. 배칭을 노린다면 여백과 무관하게 이득입니다.
묶는 기준은 로딩 시점이다
여기서 대부분이 틀립니다. 기능별로 묶으면 안 됩니다.
아틀라스는 하나의 텍스처라 일부만 올릴 수가 없습니다. 스프라이트 하나를 쓰려고 하면 그 아틀라스가 통째로 메모리에 올라옵니다.
나쁜 묶음 (기능 무관, 로딩 시점 무관)
Atlas_All
UI 아이콘 전부
레벨1 배경 타일
레벨2 보스 파츠
이펙트 시퀀스
결과: UI 하나 띄우는데 보스 텍스처까지 메모리에 상주
좋은 묶음 (로딩 시점 기준)
Atlas_UI_Common 앱이 켜져 있는 내내 상주
Atlas_Level2_Environment 레벨2 진입 시 로드
Atlas_Level2_Characters 레벨2 진입 시 로드
Atlas_FX_Combat 전투 진입 시 로드
기준을 한 문장으로 하면 이렇습니다. 같이 올라오고 같이 내려가는 것끼리 묶습니다.
레벨2의 배경과 레벨2의 캐릭터가 늘 같이 필요하면 한 장으로 묶어도 됩니다. 배경은 계속 필요한데 보스는 마지막에만 나온다면 나눠야 합니다.
크기
아틀라스 한 장의 최대 크기는 2048에서 4096 사이가 무난합니다.
- 8192는 쓰지 마세요. 저사양 모바일에서 로드 자체가 실패하거나 메모리가 감당이 안 됩니다. 한 장이 8K면 압축해도 상당한 크기입니다
- 반대로 스프라이트 한두 장짜리 아틀라스도 의미가 없습니다. 빈 공간만 늘고 배치 이득도 없습니다. 그냥 개별 텍스처로 두거나 다른 아틀라스에 합칩니다