개요

유니티의 SRP Batcher가 OpenGLES와 Vulkan API에서 차이점과 기타 특이사항을 정리했습니다.

테스트 환경

  • Unity 2022.1.22f1 / URP 13.1.8
  • 갤럭시s10e / ARM Mali-G76
  • Unity Profiler / RenderDoc

 

SRP Batcher 기능과 성능 측정

SRP Batcher는 Render States 변동이 필요 없는 경우 추가 명령을 생성하지 않는 방식으로 최적화합니다.

Render States 변동 여부는 유니티 엔진에서는 SetPass Calls 수치로 확인 할 수 있습니다.

 

SRP Batcher 유무에 따라 RenderDoc에서 API 호출 상태를 비교해보겠습니다. (OpenGLES 빌드)

Renderer 9개 / Mesh 1종 / Material 9종

 

유니티 엔진에서 Draw calls와 SetPass Calls는 RenderDoc에서 렌더 이벤트와 그 내부의 렌더 API 호출 내용으로 확인 할 수 있습니다.

아래와 같은 경우는 첫번째 렌더 이벤트에서 Draw calls와 SetPass Calls API 명령이 전부 들어 있습니다.

 

두 번째 이벤트부터 SRP Batcher 유무 차이를 확인 할 수 있습니다.

SRP Batcher를 활성화 상태인 경우 Render States 변경 명령이 없어 API 갯수가 줄어들 었습니다.

 

RenderDoc의 Statistics창에서 최종 렌더 정보 요약을 확인 할 수 있는데 여기서도 API calls 갯수 차이를 확인 할 수 있습니다.

좌 : SRP Batcher Off 우 : SRP Batcher On

 

 

 

다음 유니티 프로파일러에서 성능 비교입니다. 확실한 비교를 위해 200개의 오브젝트 세팅했습니다.

Renderer 200개 / Mesh 1종 / Material 200종

 

Draw calls 및 SetPass Calls에 의한 성능 측정은 CPU Usage의 Render Loop 항목을 확인합니다.

SRP Batcher를 활성화하는 경우 그래프 스파이크 폭이 줄어들고 메인 쓰레드와 렌더 쓰레드의 Render Loop 소요 시간이 줄어 들었습니다.

SRP Batcher Off
SRP Batcher On

 

 

 

 

Material을 1종 사용하는 상황에 SRP Batcher 성능 비교

모든 Renderer가 동일한 Material 1종을 사용하는 상황. 즉, 애초부터 SetPass Calls가 1인 상황에 SRP Batcher 성능 비교에 대해서 정리했습니다. (OpenGLES 빌드)

Renderer 200개 / Mesh 1종 / Material 1종

 

RenderDoc API 호출 비교입니다. 유니티 Stats에서 SetPass Calls 수치는 동일하지만 실제로 API 호출 수치는 SRP Batcher가 활성화했을 때 더 줄어듭니다.

좌 : SRP Batcher Off 우 : SRP Batcher On
좌 : SRP Batcher Off 우 : SRP Batcher On

 

 

유니티 프로파일러에서 또한 SRP Bathcer를 활성화했을 때 Render Loop 소요 시간이 더 줄어든 것을 확인 할 수 있습니다.

SRP Batcher Off
SRP Batcher On

 

 

 

 

Vulkan API 환경에서 SRP Batcher 결과 비교

지금까지 내용은 전부 OpenGLES 환경에서 측정한 데이터입니다. Vulkan API 환경에서는 여러가지 다른 결과가 측정되었습니다.

테스트 환경은 이전과 동일하게 SetPass Calls가 1인 상황입니다..

Renderer 200개 / Mesh 1종 / Material 1종

 

RenderDoc에서 API 호출 내용을 비교해보면 SRP Batcher On/Off 결과가 동일하게 표시됩니다.

SRP Batcher Off
SRP Batcher On

 

Statisics정보입니다, 이전 OpenGLES에서는 SRP Batcher가 Off 상황에 API calls가 600개 측정되었지만 Vulkan에서는 SRP Batcher On/Off 둘다 API calls가 약 260개가 측정되었습니다.

마치 Vulkan API 환경에서는 자동으로 불필요한 RenderStates 변경 명령이 호출되지 않는 것으로 보입니다.

좌 : SRP Batcher Off 우 : SRP Batcher On

 

 

유니티 프로파일러에서도 SRP Batcher On/Off 결과가 거의 동일하게 측정되었습니다.

SRP Batcher Off
SRP Batcher On

 

 

 

이번엔 개별 Material을 사용하는 SetPass Calls가 200인 테스트 환경입니다.

Renderer 200개 / Mesh 1종 / Material 200종

 

RenderDoc API 호출 내용은 SRP Batcher On/Off 둘다 동일합니다.(세부 내용 차이가 조금 있음)

SRP Batcher Off
SRP Batcher On
좌 : SRP Batcher Off 우 : SRP Batcher On

 

 

유니티 프로파일러에서는 그래프 스파이크 폭과 성능이 SRP Batcher가 더 개선된 것으로 확인됩니다.

 

 

정리하자면 Vulkan API 환경에서는 SRP Batcher 성능 비교 결과, RenderDoc에서 측정한 API 호출 리스트는 거의 동일하지만 유니티 프로파일러에서는 성능 차이가 확인됩니다.

 

RenderDoc이 Vulkan API 환경에서 RenderStates 변화가 정확한 측정이 되는지 확인하기 위해 2개의 다른 쉐이더를 세팅한 환경을 테스트했습니다. 이 테스트 환경은 SRP Batcher를 사용해도 SetPass Calls가 증가되기 때문에 RenderDoc에서는 어떤 결과가 나오는지 확인하기 위함입니다.

 

RenderDoc에서는 정확히 다른 쉐이더가 렌더링되는 이벤트에 API가 변화가 확인되었습니다. RenderStates 변화 측정은 되긴 하는 것 같습니다.

 

 

 

 

 

결론

  • SRP Batcher는 불필요한 Render States 명령 호출을 줄여 렌더링 최적화하는 시스템으로 유니티 엔진에서는 SetPass Calls 수치로 확인가능하고 RenderDoc에서 API 호출 상태를 통해 확인 가능.
  • OpenGLES 기준, SetPass Calls가 1인 상태에서도 SRP Batcher가 활성화되는 경우 렌더 명령 API 호출이 줄어들고 실제 성능이 개선됨.
  • Vulkan 기준, SRP Batcher를 활성화하지 않아도 불필요한 Render State 명령 호출이 줄어들고 실제 성능이 개선되는 결과가 확인됨.

 

프로파일링 성능 측정 결과는 상황과 환경에 따라 다르게 측정되기 때문에 테스트 내용과 결과 참고용으로만 봐주세요,

 

 

 

 

 

 

WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,