Version: 2022.3
언어: 한국어
메시 수동 결합
BatchRendererGroup

스크립터블 렌더 파이프라인 배처

스크립터블 렌더 파이프라인(SRP) 배처는 SRP를 사용하는 애플리케이션의 성능을 대폭 향상하는 드로우 콜 최적화입니다. SRP 배처는 Unity가 같은 셰이더 배리언트를 사용하는 머티리얼의 드로우 콜을 준비하고 전달하는 데 소요하는 CPU 시간을 단축합니다.

스크립터블 렌더 파이프라인(SRP) 배처는 Unity가 동일한 셰이더 배리언트를 사용하는 머티리얼이 많이 포함된 씬을 렌더링하는 데 소요하는 CPU 시간을 단축해줍니다.
스크립터블 렌더 파이프라인(SRP) 배처는 Unity가 동일한 셰이더 배리언트를 사용하는 머티리얼이 많이 포함된 씬을 렌더링하는 데 소요하는 CPU 시간을 단축해줍니다.

요구 사항 및 호환성

이 섹션은 SRP 배처의 렌더 파이프라인 호환성에 대한 정보를 포함합니다.

렌더 파이프라인 호환성

기능 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 스크립터블 렌더 파이프라인(SRP)
SRP 배처 지원 안 함 지원 지원 지원

게임 오브젝트 호환성

특정 씬에서 일부 게임 오브젝트는 SRP 배처와 호환되는 반면, 일부 게임 오브젝트는 호환되지 않습니다. 호환되는 게임 오브젝트는 SRP 배처 코드 경로를 사용하며, 호환되지 않는 게임 오브젝트는 기본 SRP 코드 경로를 사용합니다. 자세한 내용은 SRP 배처의 동작 방식을 참조하십시오.

게임 오브젝트가 SRP 배처 코드 경로와 호환되려면 다음 요구 사항을 충족해야 합니다.

  • 게임 오브젝트가 메시나 스킨드 메시를 포함해야 하며, 파티클이어서는 안 됩니다.
  • 게임 오브젝트가 MaterialPropertyBlocks를 사용해서는 안 됩니다.
  • 게임 오브젝트가 사용하는 셰이더가 SRP 배처와 호환되어야 합니다. 자세한 내용은 셰이더 호환성을 참조하십시오.

셰이더 호환성

고해상도 렌더 파이프라인(HDRP)과 유니버설 렌더 파이프라인(URP)의 모든 릿 셰이더와 언릿 셰이더가 이 요구 사항을 충족합니다(이러한 셰이더의 파티클 버전은 예외).

커스텀 셰이더가 SRP 배처와 호환되려면 다음 요구 사항을 충족해야 합니다.

  • 셰이더가 모든 빌트인 엔진 프로퍼티를 UnityPerDraw라는 이름의 단일 상수 버퍼로 선언해야 합니다. 예: unity_ObjectToWorld 또는 unity_SHAr.
  • 셰이더가 모든 머티리얼 프로퍼티를 UnityPerMaterial이라는 이름의 단일 상수 버퍼로 선언해야 합니다.

인스펙터 패널에서 셰이더의 호환성 상태를 확인할 수 있습니다.

특정 셰이더에 대한 인스펙터 패널에서 셰이더의 호환성을 확인할 수 있습니다.
특정 셰이더에 대한 인스펙터 패널에서 셰이더의 호환성을 확인할 수 있습니다.

SRP 배처 사용

이 섹션은 Unity의 미리 빌드된 스크립터블 렌더 파이프라인에서 SRP 배처를 사용하는 방법에 대한 정보를 포함합니다.

URP에서 SRP 배처 사용

URP에서 SRP 배처를 활성화하려면 다음 단계를 따르십시오.

  1. 프로젝트 창에서 URP 에셋을 선택합니다.
  2. URP 에셋에 대한 인스펙터에서 SRP Batcher를 활성화합니다.이 옵션이 표시되지 않으면 아래의 지침을 따르십시오.

URP 에셋의 추가 프로퍼티를 표시하는 방법

Unity는 기본적으로 URP 에셋에서 특정 고급 프로퍼티를 표시하지 않습니다.사용 가능한 모든 프로퍼티를 보려면 다음과 같이 하십시오.

  • URP 에셋의 모든 섹션에서 세로 줄임표 아이콘(⋮)을 클릭하고 Show Additional Properties를 선택합니다.

추가 프로퍼티 표시

Unity가 현재 섹션에서 사용 가능한 모든 프로퍼티를 표시합니다.

모든 섹션에 있는 모든 추가 프로퍼티를 보려면 다음 단계를 따르십시오.

  1. 세로 줄임표 아이콘을 클릭하고 Show All Additional Properties를 선택합니다.Unity가 Preferences 창에서 Core Render Pipeline 섹션을 엽니다.
  2. Additional Properties > Visibility 프로퍼티에서 All Visible을 선택합니다.
Additional Properties > Visibility > All Visible
Additional Properties > Visibility > All Visible

HDRP에서 SRP 배처 사용

HDRP를 사용하면 Unity는 기본적으로 SRP 배처를 활성화합니다.SRP 배처를 비활성화하지 않는 것이 좋습니다.그러나 디버깅을 위해 SPR 배처를 일시적으로 비활성화할 수는 있습니다.

에디터를 사용하여 빌드 시점에 SRP 배처를 활성화하거나 비활성화하려면 다음 단계를 따르십시오.

  1. 프로젝트 창에서 HDRP 에셋을 선택합니다.
  2. 에셋에 대한 인스펙터에서 디버그 모드에 진입합니다. 디버그 모드에서는 SRP 배처 프로퍼티를 포함하여 HDRP 에셋의 프로퍼티를 볼 수 있습니다.
  3. Enable SRP Batcher를 선택하여 SRP 배처를 활성화하거나 비활성화합니다.

런타임 시점에 SRP 배처를 활성화하거나 비활성화하려면 C# 코드로 작성된 다음의 전역 변수를 토글하십시오.

GraphicsSettings.useScriptableRenderPipelineBatching = true;

SRP 배처의 동작 방식

전통적인 드로우 콜 최적화 방법은 드로우 콜 수를 줄이는 것입니다. 하지만 SRP 배처는 이러한 방법 대신 드로우 콜 사이의 렌더 상태 변경을 줄입니다. 이를 위해 SRP 배처는 binddraw GPU 커맨드의 시퀀스를 조합합니다. 각 커맨드 시퀀스를 SRP 배치라고 합니다.

Bind 및 Draw 커맨드를 배칭하면 드로우 콜 간에 GPU 설정이 감소합니다.
Bind 및 Draw 커맨드를 배칭하면 드로우 콜 간에 GPU 설정이 감소합니다.

최적의 렌더링 성능을 달성하려면 각 SRP 배치가 가능한 한 많은 binddraw 커맨드를 포함해야 합니다. 이를 달성하려면 셰이더 배리언트를 가능한 한 적게 사용하십시오. 계속해서 동일한 셰이더와 함께 원하는 만큼 다양한 머티리얼을 사용할 수 있습니다.

Unity가 렌더 루프 중 새로운 머티리얼을 감지하면 CPU가 모든 프로퍼티를 수집하여 상수 버퍼로 GPU에 바인드합니다. GPU 버퍼의 수는 셰이더가 상수 버퍼를 선언하는 방식에 따라 달라집니다.

SRP 배처는 머티리얼 데이터가 GPU 메모리에 지속하도록 만드는 저레벨 렌더 루프입니다. 머티리얼 콘텐츠가 변하지 않으면 SRP 배처는 렌더 상태를 변경하지 않습니다. 대신에 SRP 배처는 다음과 같이 전용 코드 경로를 사용하여 대형 GPU 버퍼로 Unity 엔진 프로퍼티를 업데이트합니다.

SRP 배처 렌더링 워크플로. SRP 배처는 전용 코드 경로를 사용하여 대형 GPU 버퍼로 Unity 엔진 프로퍼티를 업데이트합니다.
SRP 배처 렌더링 워크플로. SRP 배처는 전용 코드 경로를 사용하여 대형 GPU 버퍼로 Unity 엔진 프로퍼티를 업데이트합니다.

여기서 CPU는 위 다이어그램에서 오브젝트당 대형 버퍼로 표시된 Unity 엔진 프로퍼티만 처리합니다. 모든 머티리얼에는 GPU 메모리에 위치한, 바로 사용 가능한 지속 상수 버퍼가 있습니다. 이로 인해 렌더링이 가속화되는 이유는 다음과 같습니다.

  • 이제 모든 머티리얼 콘텐츠가 GPU 메모리에서 유지됩니다.
  • 전용 코드가 모든 오브젝트당 프로퍼티에 대해 대규모의 오브젝트당 GPU 상수 버퍼를 관리합니다.

게임 오브젝트의 SRP 배처 호환성 의도적 제거

일부 드문 경우, 의도적으로 특정 게임 오브젝트를 SRP 배처와 호환되지 않게 하고 싶을 수 있습니다. SRP 배처와 호환되지 않는 GPU 인스턴싱을 사용하려는 경우가 이러한 예에 해당합니다. 머티리얼이 똑같은 여러 개의 동일한 메시를 렌더하려는 경우에는 GPU 인스턴싱이 SRP 배처보다 더 효율적일 수 있습니다. GPU 인스턴싱을 사용하려면 다음 중 하나를 수행해야 합니다.

  • Graphics.RenderMeshInstanced를 사용합니다.
  • SRP 배처 호환성을 수동으로 제거하고 머티리얼에 대해 GPU 인스턴싱을 활성화합니다.

다음 두 가지 방법으로 게임 오브젝트의 SRP 배처 호환성을 제거할 수 있습니다.

  • 셰이더를 호환되지 않게 합니다.
  • 렌더러를 호환되지 않게 합니다.

:SRP 배처 대신 GPU 인스턴싱을 사용하는 경우, 프로파일러를 사용하여 GPU 인스턴싱이 SRP 배처보다 애플리케이션에 더 효율적인지 확인하십시오.

셰이더 호환성 제거

직접 작성한 셰이더와 셰이더 그래프 셰이더 모두 SRP 배처와 호환되지 않게 할 수 있습니다. 단, 셰이더 그래프 셰이더의 경우 셰이더 그래프를 자주 변경하고 다시 컴파일한다면 대신 렌더러의 호환성을 제거하는 것이 더 간단합니다.

Unity 셰이더와 SRP 배처의 호환성을 제거하려면 다음과 같이 셰이더 소스 파일을 변경해야 합니다.

  1. 직접 작성한 셰이더의 경우, 셰이더 소스 파일을 엽니다. 셰이더 그래프 셰이더의 경우, 셰이더 그래프의 컴파일된 셰이더 소스 코드를 새로운 셰이더 소스 파일로 복사합니다. 애플리케이션에서 셰이더 그래프가 아닌 새로운 셰이더 소스 파일을 사용합니다.
  2. 셰이더의 Properties 블록에 새로운 머티리얼 프로퍼티를 추가합니다. UnityPerMaterial 상수 버퍼에서 새로운 머티리얼 프로퍼티를 선언하지 마십시오.

머티리얼 프로퍼티는 변경할 필요가 없습니다. UnityPerMaterial 상수 버퍼에 존재하지 않는 머티리얼 프로퍼티만 있으면 셰이더와 SRP 배처의 호환성이 제거됩니다.

경고: 셰이더 그래프를 사용하는 경우, 셰이더 그래프를 편집하고 다시 컴파일할 때마다 이 프로세스를 반복해야 합니다.

렌더러 호환성 제거

개별 렌더러가 SRP 배처와 호환되지 않게 할 수 있습니다. 이를 수행하려면 렌더러에 MaterialPropertyBlock을 추가하십시오.

Unity 프레임 디버거에서 SRP 배처 프로파일링

Frame Debugger 창에서 SRP 배치의 상태를 확인할 수 있습니다. 각 SRP 배치는 Unity가 사용한 드로우 콜의 수, Unity가 셰이더에 첨부한 키워드 및 Unity가 해당 드로우 콜을 이전 드로우 콜과 배치하지 않은 이유를 표시합니다.

SRP 배처 배치의 상태를 확인하려면 다음 단계를 따르십시오.

  1. 에디터에서 프레임 디버거를 엽니다(메뉴: Window > Analysis > Frame Debugger).
  2. 프레임 디버거에서 Render Camera > Render Opaques로 이동합니다.
  3. RenderLoopNewBatcher.Draw 리스트를 확장합니다.
  4. 점검할 SRP 배치를 클릭합니다.

아래 예에서 이유는 노드의 셰이더가 다르다는 것입니다. 즉, 해당 SRP 배치의 셰이더가 이전 SRP 배치의 셰이더와 다릅니다. SRP 배처가 다른 셰이더를 사용했으므로, SRP 배처는 새 배치를 생성했습니다. 여러 SRP 배치의 드로우 콜 수가 적다면 대부분 프로젝트가 너무 많은 셰이더 배리언트를 사용하는 것입니다.

Frame Debugger 창에서 SRP 배처가 기존 배치를 계속하지 않고 새 SRP 배치를 만든 이유 등을 비롯하여 개별 배치에 대한 세부 정보를 찾을 수 있습니다.
Frame Debugger 창에서 SRP 배처가 기존 배치를 계속하지 않고 새 SRP 배치를 만든 이유 등을 비롯하여 개별 배치에 대한 세부 정보를 찾을 수 있습니다.

유니버설 렌더 파이프라인이나 고해상도 렌더 파이프라인을 사용하지 않고 직접 스크립터블 렌더 파이프라인을 작성하는 경우, 가급적 최소한의 키워드가 있는 일반적인 다목적 셰이더를 작성하십시오. 이는 원하는 수만큼 머티리얼 프로퍼티를 사용할 수 있으므로 적합합니다.

메시 수동 결합
BatchRendererGroup