Unity 내일배움캠프 TIL 1123 | 드로우 콜과 배칭

cheeseonrose·2023년 11월 23일
0

Unity 내일배움캠프

목록 보기
85/89
post-thumbnail

[유니티 TIPS] 유니티 최적화를 위한 필수 기본기! Batching 방법 소개


💡 드로우 콜과 배칭



🐱 드로우 콜

  • CPU : 디지털 콘텐츠를 구성하는 게임 오브젝트나 데이터를 읽는 역할
  • GPU : 데이터를 토대로 콘텐츠를 그리는 역할
  • CPU는 GPU에게 읽어들인 데이터를 그리는 명령을 내림
    드로우 콜



🐰 Set Pass Call

  • 커맨드 버퍼 : CPU가 GPU에게 명령을 내릴 때 따라오는 데이터들
  • 다양한 정보들의 버퍼들이 포함
  • Set Pass : 머테리얼, 셰이더 등을 묶어놓은 그룹
  • Set Pass Call : Set Pass를 전달하는 명령



🦊 배치

  • 드로우 콜 뿐만 아니라 그래픽을 구성하는 상태 데이터들도 함께 GPU에게 넘기는 것
  • 배치 수가 많을 수록 부하가 심해짐
  • 배치 수를 줄이는 것 → 최적화
  • 배치에 해당되는 컴포넌트
    • Sprite Renderer
    • Mesh Renderer
    • Line Renderer
    • Trail Renderer
    • Particle System



🐹 Dynamic Batching

  • 활성화 방법
    • Preferences - Core Render Pipeline - Additional Properties를 All Visible로 체크
    • Project Settings - Quality - Render Pipeline Asset에서 현재 사용하는 렌더 파이프라인 에셋 확인 가능
      • Render Pipeline Asset - 마우스 우클릭 - Show Additional Properties로 숨겨진 속성 확인할 수 있음
        → Dynamic Batching 활성화
  • 동일한 재질을 사용하는 메시는 버텍스의 정보를 CPU가 모은 뒤 버텍스 버퍼에 담음
  • 정점 속성을 900개 이상 가지거나 225개 이상의 정점을 포함하는 메시에는 적용 불가능



🦝 2D의 배칭

  • Sprite Renderer는 기본으로 동적 배칭 대상
  • Sprite Atlas로 편리하게 배칭 가능



🐶 Static Batching

  • Project Settings - Player - Other에서 Static Batching 옵션 활성화 확인
  • 정적으로 올릴 오브젝트를 선택한 뒤, Insepctor 창에서 오브젝트 명 옆에 있는 Static 메뉴 체크 → Batching Static을 선택하면 정적 배칭 대상 오브젝트가 됨
  • 여러 메시들의 정점을 하나로 통합하면서 정적인 오브젝트가 되므로 트랜스포밍이 불가능
  • 정적으로 체크되면 내부에서 하나의 메시로 통합되면서 올라가므로 메모리가 많이 필요



🐸 SRP Batching

  • Project Settings - Quality - Render Pipeline Asset
    • Render Pipeline Asset - 마우스 우클릭 - Show Additional Properties - SRP Batcher
    • URP와 HDRP는 기본적으로 체크되어 있음
  • Batches는 줄어들지 않지만 SetPass call은 줄어듦
    → 다른 머테리얼을 사용해도 SetPass call이 줄어든다!
    → 다른 머테리얼이라도 하나의 셰이더를 사용해야 한다는 조건이 있음
  • 셰이더가 SRP Batcher와 호환되는지는 인스펙터 상에서 확인 가능



🦁 GPU Instancing

  • Render Pipeline Asset - SRP Batcher 옵션 비활성화
  • Material - Advanced Options - Enable GPU Instancing 활성화
  • CPU가 하나의 메시만 데이터를 읽어서 GPU에게 넘김
    → GPU는 자기 자신의 메모리에 저장
    → GPU는 내부에서 위치 정보만 가지고 동일한 메시를 계속 그려나가게 됨
  • 요즘은 그래픽 카드의 성능이 많이 좋아졌기 때문에 이런 방식으로 GPU에게 일을 넘기기도 함
  • 그렇다고 무수히 많은 오브젝트들이 단 하나의 배치에 포함되는 것은 아님
    • 어느 정도 페이징 처리가 된다
  • SRP Batcher와 함께 사용 불가능
  • GPU Instancing을 사용하면 Frame Debugger의 RenderLoop 항목에서 Instance로 표시됨
    • DrawInstanced Call로 따로 체크 됨
  • Unity에서는 하나의 메시에 256개 미만의 버텍스를 가지고 있다면 비효율적인 퍼포먼스가 나옴





끄으읏

0개의 댓글