개요

SRPBatcher는 SetPass Calls API를 배칭(묶어)하여 CPU 렌더 호출 비용을 최적화하는 시스템입니다.

하지만 SRPBatcher를 사용해도 렌더링하는 오브젝트가 많을 경우에는 여전히 CPU 렌더 호출 비용이 높은 상황이 있습니다.

이번 포스팅은 CPU 렌더 호출 비용을 조금이라도 최적화하기 위해서 SRPBatcher가 효율적으로 동작할 수 있는 환경을 테스트해본 내용을 정리합니다.

 

테스트 주제는 아래와 같습니다.

  • SRP Batcher가 동작하는 환경에서 단일 Material을 공유하는게 SRP Batcher에 효과가 있는가?

 

테스트 결과 미리 요약

  • 단일 Material 공유 여부는 SRP Batcher 및 CPU 렌더 호출 비용에 약간의 성능 향상이 있음.
    • Material 1개 vs Mateirla 300개 기준 CPU 렌더콜 성능 1 ~ 2ms 차이 확인.
  • 쉐이더의 CBuffer 변수 갯수는 SRP Batcher 및 CPU 렌더 호출 비용에 유의미한 영향 없음.
  • CPU 렌더 호출 비용을 줄이는 직접적인 방법은 Renderer를 줄여 드로우콜을 낮추는 것.

테스트 환경

  • Unity 2022.1.22f1 / URP 13.1.8
  • 갤럭시s10e / ARM Mali-G76 / Vulkan
  • 320p / 30fps 
  • Unity Profiler / RenderDoc

1. Material 1종 vs Material 개별 Instancing

Renderer 300개 / Mesh 1종 / 좌 - Material 1종, 우 - Material 개별 Instancing
좌 - Material 1종, 우 - Material 개별 Instancing

최소 / 최대 ms Material 1종 Material 개별 Instancing
메인 쓰레드 5.7 / 8.53 5.79 / 9.82
렌더 쓰레드 3.24 / 3.77 4.22 / 5.95
CPU 렌더 콜 총합 7.74 / 10.42 8.69 / 12.80

 

Material 1종 공유하는 것과, 모든 Renderer가 다른 Material을 Instancing하는 것은 CPU 렌더콜 성능에 약간의 차이가 확인되었습니다.

테스트에 사용한 쉐이더는 URP Lit이며, 쉐이더 복잡도나 메쉬 버텍스 카운트에 따라 결과 차이가 변화될 여지가 있습니다. 

 

2. Material 개별 Instancing vs Material 개별 Instancing + 추가 프로퍼티 변화

다음 테스트는 Material 개별 Instancing은 동일하지만 1개의 Case에는 Material 프로퍼티 변화를 추가로 반영했습니다.

 

Renderer 300개 / Mesh 1종 / 좌 - Material 개별 Instancing, 우 - Material 개별 Instancing + 추가 프로퍼티 변화
좌 - Material 개별 Instancing, 우 - Material 개별 Instancing + 추가 프로퍼티 변화

최소 / 최대 ms Material 개별 Instancing Instancing + 추가 프로퍼티 변화
메인 쓰레드 5.79 / 9.82 5.43 / 8.23
렌더 쓰레드 4.22 / 5.95 4.17 / 5.01
CPU 렌더 콜 총합 8.69 / 12.80 8.04 / 11.45

 

동일하게 Material 개별 Instancing 환경에서 CBuffer에 선언된 Material 프로퍼티 변화 차이만 측정했습니다.

유의미한 차이는 없으며 심지어, 추가 프로퍼티 변화한 케이스가 더 성능이 가볍게 측정되었습니다.

 

 

3. Material 개별 Instancing vs 개별 Instancing + Reflection Probe Blending

이번 테스트는 개별 Instancing 환경에서 5개의 Reflection Probe를 걸쳐서 배치했습니다.

추가로 Reflection Probe Blending 기능까지 활성화했습니다.

렌더피쳐 단계에서 글로벌 프로퍼티로 텍스처 정보를 전달하는 것에 대한 차이를 측정하기 위함입니다.

 

좌 - Material 개별 Instancing, 우 - Material 개별 Instancing + Reflection Probe Blending

최소 / 최대 ms Material 개별 Instancing Instancing + Refl ProbeBlending
메인 쓰레드 5.79 / 9.82 6.93 / 11.32
렌더 쓰레드 4.22 / 5.95 4.76 / 5.16
CPU 렌더 콜 총합 8.69 / 12.80 8.126 / 13.04

 

동일한 Material 개별 Instancing 환경에서 Reflection Probe Blending 테스트는 유의미한 차이가 없습니다.

 

 

4. Material 개별 Instancing, Renderer 100개 vs 300개

Material 개별 Instancing / 좌 - Rendere 100개, 우 - Renderer 300
Material 개별 Instancing / 좌 - Rendere 100개, 우 - Renderer 300

최소 / 최대 ms Renderer 100개 Renderer 300개
메인 쓰레드 3.73 5.79 / 9.82
렌더 쓰레드 2.01 4.22 / 5.95
CPU 렌더 콜 총합 5.16 8.69 / 12.80

 

이번에는 단순히 Renderer 갯수 별로 측정하고 드로우콜 API 차이를 테스트해봤습니다.

결과는 정직하게 드로우콜 API 차이가 CPU 렌더콜 성능에 직접적으로 영향을 주는 것이 확인되었습니다.

 

Material 개별 Instancing / 좌 - Rendere 100개, 우 - Renderer 300

렌더독 확인 결과 특이사항 없습니다.


WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,