합치는 비용이 그리는 비용보다 클 때
같은 스프라이트를 쓰는 총알 200발이 화면에 있습니다. 텍스처도 같고 머티리얼도 같습니다. 그런데 GameObject 가 200개라 메시는 200개 입니다. 그리라는 명령도 200번 나갑니다.
다이나믹 배칭은 여기에 이렇게 답합니다. 그러면 하나로 합쳐서 한 번에 그리자.
합친다는 것의 의미
각 오브젝트의 메시는 자기 로컬 좌표계에 있습니다. 한 버퍼에 이어 붙이려면 전부 같은 좌표계로 옮겨야 합니다. 그래서 배칭은 정점을 월드 공간으로 변환하는 일 입니다.
정점이 몇 개 안 되면 이건 싼 작업입니다. 스프라이트 하나는 사각형이라 정점 4개뿐입니다. 총알 200발이면 800개 정점을 옮기고 그리기 명령 199번을 아낍니다. 남는 장사입니다.
부등호
그래서 이 조건이 전부입니다.
합치는 비용 < 그리기 명령 비용 일 때만 이득입니다.
왼쪽은 정점 수에 비례해서 커지고, 오른쪽은 하드웨어와 그래픽스 API 가 정합니다. 그리고 오른쪽이 계속 싸지고 있습니다. 요즘 API 는 드로우 콜 하나를 넘기는 비용이 예전보다 훨씬 낮습니다. 부등호가 뒤집히기 좋은 조건입니다.
정점 4개짜리 스프라이트는 몇 개를 놓든 합치는 쪽이 이깁니다. 정점 40개만 돼도 요즘 하드웨어에서는 뒤집힙니다. 그리고 예전 하드웨어로 바꾸면 다시 합치는 쪽이 이깁니다. “다이나믹 배칭은 좋다” 는 문장에 유통기한이 있었다는 뜻입니다.
조건
이득이든 손해든, 애초에 배칭이 걸리려면 조건을 만족해야 합니다.
- 같은 머티리얼 이어야 합니다. 텍스처가 다르면 다른 머티리얼입니다
- 정점 수 제한 이 있습니다. 정점 특성 개수에 따라 상한이 정해집니다. 스프라이트는 여유롭게 통과하지만 조금만 복잡한 메시면 걸립니다
- 스케일이 음수로 뒤집힌 오브젝트, 라이트맵이 다른 오브젝트 등은 빠집니다
조건을 못 맞춘 오브젝트는 조용히 빠져서 개별로 그려집니다. 에러가 안 나기 때문에, 배칭이 걸린다고 믿고 있는데 실제로는 안 걸린 상태가 흔합니다. Frame Debugger 를 열어서 확인하는 게 유일한 방법입니다.
Unity 6 에서의 위치
URP 에서 다이나믹 배칭은 우선순위가 내려갔습니다. 기본 주력이 아닙니다. 위의 부등호가 자주 뒤집히기 때문입니다.
다만 꺼진 것은 아닙니다. 주력 방식이 처리하지 못하는 오브젝트에 대해 폴백으로 계속 돕니다. 그러니 “다이나믹 배칭은 이제 안 쓴다” 도 정확한 말이 아닙니다. 프로젝트 설정에서 끄고 켤 수 있고, 2D 처럼 정점이 적은 콘텐츠에서는 켜 두는 쪽이 이득인 경우가 남아 있습니다.