스크립터블 렌더 파이프라인(SRP) 배처는 SRP를 사용하는 애플리케이션의 성능을 대폭 향상하는 드로우 콜 최적화입니다. SRP 배처는 Unity가 같은 셰이더 배리언트를 사용하는 머티리얼의 드로우 콜을 준비하고 전달하는 데 소요하는 CPU 시간을 단축합니다.
이 섹션은 SRP 배처의 렌더 파이프라인 호환성에 대한 정보를 포함합니다.
기능 | 빌트인 렌더 파이프라인 | 유니버설 렌더 파이프라인(URP) | 고해상도 렌더 파이프라인(HDRP) | 커스텀 스크립터블 렌더 파이프라인(SRP) |
---|---|---|---|---|
SRP 배처 | 지원 안 함 | 지원 | 지원 | 지원 |
특정 씬에서 일부 게임 오브젝트는 SRP 배처와 호환되는 반면, 일부 게임 오브젝트는 호환되지 않습니다. 호환되는 게임 오브젝트는 SRP 배처 코드 경로를 사용하며, 호환되지 않는 게임 오브젝트는 기본 SRP 코드 경로를 사용합니다. 자세한 내용은 SRP 배처의 동작 방식을 참조하십시오.
게임 오브젝트가 SRP 배처 코드 경로와 호환되려면 다음 요구 사항을 충족해야 합니다.
고해상도 렌더 파이프라인(HDRP)과 유니버설 렌더 파이프라인(URP)의 모든 릿 셰이더와 언릿 셰이더가 이 요구 사항을 충족합니다(이러한 셰이더의 파티클 버전은 예외).
커스텀 셰이더가 SRP 배처와 호환되려면 다음 요구 사항을 충족해야 합니다.
UnityPerDraw
라는 이름의 단일 상수 버퍼로 선언해야 합니다. 예: unity_ObjectToWorld
또는 unity_SHAr
.UnityPerMaterial
이라는 이름의 단일 상수 버퍼로 선언해야 합니다.인스펙터 패널에서 셰이더의 호환성 상태를 확인할 수 있습니다.
이 섹션은 Unity의 미리 빌드된 스크립터블 렌더 파이프라인에서 SRP 배처를 사용하는 방법에 대한 정보를 포함합니다.
URP에서 SRP 배처를 활성화하려면 다음 단계를 따르십시오.
HDRP를 사용하는 경우, Unity는 기본적으로 SRP 배처를 활성화합니다. SRP 배처 비활성화는 권장되지 않습니다. 단, 디버깅을 위해 일시적으로 SRP 배처를 비활성화할 수 있습니다.
에디터를 사용하여 빌드 시점에 SRP 배처를 활성화하거나 비활성화하려면 다음 단계를 따르십시오.
런타임 시점에 SRP 배처를 활성화하거나 비활성화하려면 C# 코드로 작성된 다음의 전역 변수를 토글하십시오.
GraphicsSettings.useScriptableRenderPipelineBatching = true;
전통적인 드로우 콜 최적화 방법은 드로우 콜 수를 줄이는 것입니다. 하지만 SRP 배처는 이러한 방법 대신 드로우 콜 사이의 렌더 상태 변경을 줄입니다. 이를 위해 SRP 배처는 bind
및 draw
GPU 커맨드의 시퀀스를 조합합니다. 각 커맨드 시퀀스를 SRP 배치라고 합니다.
최적의 렌더링 성능을 달성하려면 각 SRP 배치가 가능한 한 많은 bind
및 draw
커맨드를 포함해야 합니다. 이를 달성하려면 셰이더 배리언트를 가능한 한 적게 사용하십시오. 계속해서 동일한 셰이더와 함께 원하는 만큼 다양한 머티리얼을 사용할 수 있습니다.
Unity가 렌더 루프 중 새로운 머티리얼을 감지하면 CPU가 모든 프로퍼티를 수집하여 상수 버퍼로 GPU에 바인드합니다. GPU 버퍼의 수는 셰이더가 상수 버퍼를 선언하는 방식에 따라 달라집니다.
SRP 배처는 머티리얼 데이터가 GPU 메모리에 지속하도록 만드는 저레벨 렌더 루프입니다. 머티리얼 콘텐츠가 변하지 않으면 SRP 배처는 렌더 상태를 변경하지 않습니다. 대신에 SRP 배처는 다음과 같이 전용 코드 경로를 사용하여 대형 GPU 버퍼로 Unity 엔진 프로퍼티를 업데이트합니다.
여기서 CPU는 위 다이어그램에서 오브젝트당 대형 버퍼로 표시된 Unity 엔진 프로퍼티만 처리합니다. 모든 머티리얼에는 GPU 메모리에 위치한, 바로 사용 가능한 지속 상수 버퍼가 있습니다. 이로 인해 렌더링이 가속화되는 이유는 다음과 같습니다.
일부 드문 경우, 의도적으로 특정 게임 오브젝트를 SRP 배처와 호환되지 않게 하고 싶을 수 있습니다. SRP 배처와 호환되지 않는 GPU 인스턴싱을 사용하려는 경우가 이러한 예에 해당합니다. 머티리얼이 똑같은 여러 개의 동일한 메시를 렌더하려는 경우에는 GPU 인스턴싱이 SRP 배처보다 더 효율적일 수 있습니다. GPU 인스턴싱을 사용하려면 다음 중 하나를 수행해야 합니다.
다음 두 가지 방법으로 게임 오브젝트의 SRP 배처 호환성을 제거할 수 있습니다.
팁: SRP 배처 대신 GPU 인스턴싱을 사용하는 경우, 프로파일러를 사용하여 GPU 인스턴싱이 SRP 배처보다 애플리케이션에 더 효율적인지 확인하십시오.
직접 작성한 셰이더와 셰이더 그래프 셰이더 모두 SRP 배처와 호환되지 않게 할 수 있습니다. 단, 셰이더 그래프 셰이더의 경우 셰이더 그래프를 자주 변경하고 다시 컴파일한다면 대신 렌더러의 호환성을 제거하는 것이 더 간단합니다.
Unity 셰이더와 SRP 배처의 호환성을 제거하려면 다음과 같이 셰이더 소스 파일을 변경해야 합니다.
Properties
블록에 새로운 머티리얼 프로퍼티를 추가합니다. UnityPerMaterial
상수 버퍼에서 새로운 머티리얼 프로퍼티를 선언하지 마십시오.머티리얼 프로퍼티는 변경할 필요가 없습니다. UnityPerMaterial
상수 버퍼에 존재하지 않는 머티리얼 프로퍼티만 있으면 셰이더와 SRP 배처의 호환성이 제거됩니다.
경고: 셰이더 그래프를 사용하는 경우, 셰이더 그래프를 편집하고 다시 컴파일할 때마다 이 프로세스를 반복해야 합니다.
개별 렌더러가 SRP 배처와 호환되지 않게 할 수 있습니다. 이를 수행하려면 렌더러에 MaterialPropertyBlock
을 추가하십시오.
Frame Debugger 창에서 SRP 배치의 상태를 확인할 수 있습니다. 각 SRP 배치는 Unity가 사용한 드로우 콜의 수, Unity가 셰이더에 첨부한 키워드 및 Unity가 해당 드로우 콜을 이전 드로우 콜과 배치하지 않은 이유를 표시합니다.
SRP 배처 배치의 상태를 확인하려면 다음 단계를 따르십시오.
아래 예에서 이유는 노드의 셰이더가 다르다는 것입니다. 즉, 해당 SRP 배치의 셰이더가 이전 SRP 배치의 셰이더와 다릅니다. SRP 배처가 다른 셰이더를 사용했으므로, SRP 배처는 새 배치를 생성했습니다. 여러 SRP 배치의 드로우 콜 수가 적다면 대부분 프로젝트가 너무 많은 셰이더 배리언트를 사용하는 것입니다.
유니버설 렌더 파이프라인이나 고해상도 렌더 파이프라인을 사용하지 않고 직접 스크립터블 렌더 파이프라인을 작성하는 경우, 가급적 최소한의 키워드가 있는 일반적인 다목적 셰이더를 작성하십시오. 이는 원하는 수만큼 머티리얼 프로퍼티를 사용할 수 있으므로 적합합니다.