Draw Call 과 Batching 간단한 개념 정리입니다. 예전에도 있었는지는 모르겠는데 유니티 문서에 잘 정리 되있네요 (http://unity3d.com/support/documentation/Manual/iphone-DrawCall-Batching.html) 이걸 간단히 약간 각색하여 올립니다.
1. Draw Call 과 Batching
1.1 Draw Call 우리는 물체를 화면에 그릴 때 마다 그 물체에 관련된 매터리얼( = 텍스처+ 쉐이더+ 기타설정값들)과 메쉬를 비디오 카드에 보냅니다. 이때 1번의 Draw Call이 소요 되며 이에 따라 비디오 카드의 정보를 갱신하는데 시간이 걸립니다.
1.2 Batching 그렇기 때문에 하나의 매터리얼을 공유하는 여러 개의 메쉬들를 합쳐서 비디오 카드에 보낼 수 있으면 합쳐진 숫자만큼 Draw Call이 줄어들게 됩니다. 이렇게 여러 개의 물체를 합치는 것이 Batching 작업입니다.
이런 작업은 맥스나 마야같은 그래픽 툴에서 해도 상관없지만 유니티에서는 물체가 카메라에 보이는지 가시성 판단을 한 후에 Batching작업이 이루어지므로 유니티에서 할 경우 컬링에 대한 이득이 있습니다. (그래픽 툴에서 물체들을 합쳐놓으면 물체가 커지게 되고 물체의 일부만 카메라에 보여도 컬링이 안되게 되므로 성능상 손실이 있음)
1.3 Materials 매터리얼(=텍스처 + 쉐이더)을 교체 할 때마다 새로운 Draw Call이 필요하기 때문에 씬상에 가능한 적은 수의 매터리얼을 사용하는 것이 Draw Call을 줄이는데 도움이 됩니다. 예를 들어 쉐이더는 동일하지만 텍스처만 다른 두개의 매터리얼이 있다면 두 텍스처를 하나로 합친 후 하나의 매터리얼만 사용하는 방식으로 바꾼다면 성능향상에 도움이 될 수 있습니다.
만약 코드상에서 Renderer.material 을 수정하면 새로운 매터리얼이 생성되기 때문에 Renderer.sharedMaterial 을 수정해야만 Batching 작업의 효율을 유지 할 수 있음을 유의 하셔야 합니다. (하지만 이 경우 매터리얼을 공유하는 모든 물체에 적용되기 때문에 한 물체의 색만 변경하거나 하고 싶을 경우 어쩔 수 없이 Renderer.material을 수정해야 함)
2. Dynamic Batching and Static Batching
2.1 Dynamic Batching 유니티는 동일한 매터리얼을 공유하는 움직이는 물체(static flag 체크가 안된 물체)에 대해서 Dynamic Batching을 자동적으로 적용해 주지만 버택스 수에 때라서 계산 부하가 증가하기 때문에 300 버택스 이하 물체에 대해서만 Dynamic Batching을 적용해 줍니다.
2.2 Static Batching Static Batching은 매터리얼을 공유하는 움직이지 않는 물체(static flag 체크가 된 물체)에 대해서 물체의 크기(버택스 수)에 관련없이 적용되기 때문에 Dynamic Batching에 비해 훨씬 효율적으로 Batching작업을 수행 합니다.
Static Batching을 통한 성능향상을 위해서는 대상 물체는 Static flag체크가 되있어야 하며 실행 중 이동, 회전, 크기변경이 모두 이루어지지 않아야만 합니다.
Editor상에서 또는 실행 중 Static Batching 작업이 일어날 경우 동일한 매터리얼을 공유하는 물체들을 모두 합쳐 놓은 매쉬를 추가로 생성하며 이를 저장하기 위한 추가 메모리가 필요하기 때문에 경우에 따라서는 메모리를 절약하기 위해 Static Batching을 포기해야 되는 경우도 있을 수 있습니다. 예를 들어 나무가 아주 많은 숲에서 Static으로 나무들을 설정하여 모두 합치게 된다면 메모리를 매우 많이 소모하게 될 수 있습니다.