배칭은 다섯 가지 이유로 끊긴다
배칭이 걸리는 조건은 앞에서 봤습니다. 실무에서 더 자주 쓰게 되는 건 반대쪽 목록입니다. 무엇이 배치를 끊는가.
다섯 가지입니다. 앞의 둘은 에셋 문제이고, 뒤의 셋은 배치 문제입니다. 이 구분이 중요합니다. 뒤의 셋은 스프라이트를 아무리 합쳐도 안 풀립니다.
1. 셰이더를 섞어 썼다
Sprite-Default 를 쓰는 오브젝트와 Sprite-Lit-Default 를 쓰는 오브젝트가
번갈아 나오면 그 경계마다 끊깁니다. 커스텀 셰이더를 하나 추가하면
배치가 하나 더 쪼개집니다.
- Frame Debugger:
Objects have different materials - 조치: 셰이더 종류 수를 줄입니다. 라이팅이 필요 없는 오브젝트까지 Lit 셰이더로 통일하는 편이 나은 경우도 있습니다. 셰이더가 두 종류면 최소 두 배치이지만, 한 종류면 한 배치로 갈 수 있습니다
2. 텍스처가 갈라져 있다
텍스처는 머티리얼 상태의 일부입니다. 셰이더가 같아도 텍스처가 다르면 바인딩을 갈아야 하고, 그 순간 배치가 끊깁니다.
- Frame Debugger: 위와 같은
Objects have different materials - 조치: 스프라이트 아틀라스로 물리적 텍스처를 합칩니다. 아틀라스 통합이 곧 배칭 통합인 이유가 이것입니다
여기까지가 에셋을 손봐서 푸는 두 가지입니다.
3. Sorting Layer 를 잘게 쪼갰다
2D 는 그리는 순서가 곧 앞뒤입니다. 그 순서를 정하는 것이 Sorting Layer 와 Order in Layer 이고, 배칭은 이 정렬 단위 안에서만 이어집니다.
레이어를 하나 늘리는 건 인스펙터에서 한 줄 추가하는 일이라 부담이 없어 보입니다. 그런데 레이어를 잘게 쪼갤수록 드로우 콜도 그만큼 쪼개집니다.
- Frame Debugger:
Objects are in different sorting layers - 조치: 레이어를 큼직하게 유지합니다. 배경, 게임플레이, 전경, UI 정도로 두고 그 안의 앞뒤는 Order in Layer 나 Y 좌표 정렬로 처리합니다
레이어를 늘리는 것은 공짜가 아닙니다. 정리 편하려고 열 개를 만들면 그만큼 배치가 나뉩니다.
4. 반투명 렌더 순서가 교차한다
이게 2D 에서 제일 자주 걸리고 제일 안 풀리는 것입니다.
반투명은 뒤에서 앞으로 순서대로 그려야 색이 제대로 섞입니다. 그래서 깊이가 교차하면 Unity 가 순서를 지키려고 배치를 강제로 끊습니다. 머티리얼도 같고 텍스처도 같은데 끊깁니다.
- Frame Debugger: 깊이나 반투명 순서를 가리키는 문구
- 조치: Z 배치를 층 단위로 다시 정리합니다. 나무를 전부 한 층에 두고 캐릭터를 그 앞 층에 두면 됩니다. “나무 하나만 플레이어보다 앞” 같은 예외가 하나 생기면 그 순간 층이 깨집니다
5. Mesh 2D 셰이더를 섞었다
Unity 6.3 부터 3D 메시를 2D 정렬 체계에 넣을 수 있게 됐는데, 그 셰이더 계열은 현재 SRP Batcher 와 호환되지 않습니다. 스프라이트 사이에 이걸 자주 끼우면 배치가 그때마다 끊깁니다.
- 조치: 3D 를 쓸 자리를 층으로 몰아 둡니다. 배경 층에만 넣고 게임플레이 층에는 안 섞는 식입니다. 버전에 따라 바뀔 수 있으니 쓰는 패치 릴리스 노트를 확인하세요
어느 것부터
다섯 개를 한꺼번에 손볼 필요는 없습니다. Frame Debugger 를 열어서 끊긴 지점 상위 다섯 개와 그 사유를 표로 적는 것이 먼저입니다.
대개 하나가 압도적입니다. 그리고 그 하나가 무엇인지는 프로젝트마다 다릅니다. 타일맵 위주면 3번이고, 캐릭터가 많으면 4번이고, 이펙트가 많으면 1번입니다. 남의 프로젝트에서 1번이 범인이었다는 것은 내 프로젝트와 아무 상관이 없습니다.