Unity 그래픽 최적화

JHO·2026년 8월 31일

유니티 3D

목록 보기
15/15

1. Batch 란?


1-1. DrawCall과 SetPasscall

  • Draw Call : CPU가 GPU에게 오브젝트를 그려달라 요청하는 행위 -> 이때, 큐를 이용해 CPU가 작업을 넣어두면, GPU는 자신의 작업속도에 맞춰서 꺼내서 작업진행.
  • SetPass Call: GPU가 실제 DrawCall을 처리하기 전, ShaderPass, Material 및 Blend/Depth/Cull 등의 렌더링 상태를 설정하거나 변경하는 호출 횟수.
  • Batch : 동일한 렌더링 상태를 공유하는 오브젝트들을 묶어 처리하는 렌더링 작업 단위로, 배칭을 통해 Draw Call 및 불필요한 SetPass Call을 줄일 수 있음.
    -> 우리가 보통 렌더링 최적화를 하기위해선 이 Batch수를 줄여야할 필요ㅇ.
  • GPU 입장에서는 SetPassCall -> Draw Call -> GPU 렌더링 순으로 작업을 진행.

1-2. 예시

  • 3개의 Object가 같은 Material을 사용하는 경우
    A → 빨강 Material
    B → 빨강 Material
    C → 빨강 Material
    SetPass → 빨강 Material/Shader 상태 설정 ← 1
    Draw A ← 1
    Draw B ← 2
    Draw C ← 3
    결과: SetPassCall 1/ Draw Call
  • 3개의 Object가 각자 다른 Material을 사용하는 경우
    A → 빨강 Material
    B → 파랑 Material
    C → 투명 Material
    SetPass → 빨강 설정 ← 1
    Draw A ← 1
    SetPass → 파랑 설정 ← 2
    Draw B ← 2
    SetPass → 투명 설정 ← 3
    Draw C ← 3
    결과: SetPassCall 3/ Draw Call 3

1-3. Batch 적용되는 컴포넌트

  • SpriteRenderer
  • MeshRenderer
  • LineRenderer
  • TrailRenderer
  • ParticleSystem

2. 실제 예시


2-1. 같은 Mateiral을 사용할 때 얻는 최적화

  • 각자 다른 Material를 쓰고 있는 경우 Batches:8/ SetPass Calls:8 인 상황.
  • 모두 동일 Material을 사용하도록 구조를 바꾸게 된 경우 Batches:8/ SetPassCalls: 3로 Batches수는 그대로이나 SetPassCalls수가 줄어든 상태.
  • SetPassCall 횟수자체를 줄인것도 큰 이익.

3. Dynamic 배칭과 Static 배칭


3-1. Dynamic 배칭

  • Dynamic Batching: 런타임에서 조건이 맞으면 자동으로 묶어서 DrawCall을 줄이는 방식.
  • 단점으로, CPU 연산 증가.
  • 따라서 무조건 해당 설정을 ON하는 것보단, 작은 Mesh가 많고, 서로 Material 등 배칭 조건이 맞는 경우 CPU비용보다 DrawCall 줄이는 효과가 클때 사용하는것이 효과적.
  • Dynamic Batching 켜기.
  • saved by batching이 5개로 늘고, Batches:3으로 줄어든것을 확인 가능.
  • 프레임 디버거로 확인하면 DrawDynamic이라고 표기되며, Draw Call 한번에 해당 오브젝트들이 모두 그려진것을 확인.
  • 추가로, 정점 속성을 900개 이상을 가지거나, 225개 이상의 정점을 포함하는 메시에는 적용 불가.
  • 2D에서 SpriteRender와 Atlas는 기본적으로 동적 배칭을 사용.

3-2. Static 배칭

  • 움직이지 않은 오브젝트들을 묶어서 Draw Call을 줄이는 방식.
  • 단점으로, 메모리 사용량 증가가능.
  • 정적배칭 또한 Saved by batching:5가 생기며, Baches수는 줄어드나, Transforming이 안되는 상황이 발생.

4. SRP Batcher와 GPU 인스턴싱


4-1. SRP Batcher

  • SetPass 및 Draw 준비 과정의 CPU 비용을 줄이는 기술
  • URP는 기본적으로 사용하는 상태.
  • SRP Batcher를 사용하는 경우, 각자의 Object가 다른 메터리얼을 사용하고 있는 상황임에도 불구하고 SetPass call이 줄어드는 상황을 볼수가 있다.
  • 이때 주의점은, 그 각자 다른 메터리얼이 하나의 공통된 Shader를 사용해야한다는 조건이 필요.
  • 사용 하는 쉐이더가 SRP Batcher를 호환하는지 확인 필요.

4-2. GPU 인스턴싱

  • 동일한 Mesh와 Material을 사용하는 여러 오브젝트를 하나의 Instanced Draw Call로 처리하여 Batch/Draw Call 수를 감소시키는 기법.
    -> ex) 나무 Mesh + 나무Material A <-> 집 Mesh + 나무 Material B ---- A와 B는 같은 GPU Instancing으로 묶이지않음.
  • SRP Batcher와 동시에 사용 불가능.
  • 사용하는 매터리얼의 쉐이더가 SRP Batcher와 호환하지 않는 것이라면 꼭 OFF할필요는 없음.
  • 1개만 Batch 되고, 나머지는 모두 Save된 상태를 확인 가능.
  • CPU가 하나의 mesh만 읽어서, GPU에 전달하고, GPU는 자기자신에 저장해서 사용.
    -> 즉, CPU가 한번의 드로우콜로 동일한 매시와 매터리얼을 가진 여러 오브젝트를 렌더링하도록하는 기법.
  • Draw Calls 쪽이 아닌 DrawInstanced Call쪽으로 포함.
  • Unity에서는 하나의 Mesh에 256미만의 Vertex를 가지고있다면 비효율적인 퍼포먼스가 나온다고 함.
profile
개발노트

0개의 댓글