GPU 인스턴싱
GPU Instancing의 핵심은 동일한 메시와 머티리얼을 사용하는 여러 객체들을 하나의 드로우 콜로 묶는 것입니다.
GPU Instancing을 활용하면 드로우 콜의 수를 많이 줄일 수 있으므로, 성능이 향상됩니다.
드로우 콜은 CPU가 GPU에게 그림을 그리라는 명령입니다.
GPU 인스턴싱 전제조건
1.
동일한 메시를 사용해야 합니다.
2.
동일한 머티리얼을 사용해야 합니다.
3.
머티리얼은 GPU Instancing을 지원해야 합니다.
a.
GPU Instancing을 활성화하려면, 머티리얼의 Inspector 패널에서 Enable Instancing 체크박스를 선택합니다.
b.
커스텀 셰이더일 경우, GPU Instacning이 호환이 가능하도록 제작되어야합니다.
4.
오브젝트들은 동일한 렌더링 설정(예: 같은 레이어에 있어야 함)을 공유해야 합니다.
Material Property Block의 사용
GPU 인스턴싱을 사용할 때 주의해야 할 점이 있습니다.
Material의 속성값에 직접 접근하여 변경하는 것은 피해야 합니다.
using UnityEngine;
public class ChangeColorIncorrectly : MonoBehaviour
{
public Renderer cubeRenderer;
void Start()
{
// 이렇게 하면 새 머티리얼 인스턴스가 생성되며, GPU Instancing의 이점이 사라집니다.
cubeRenderer.material.SetColor("_Color", Color.red);
}
}
C#
복사
위와 같이 머티리얼의 색상값을 직접 변경하면, 새로운 머티리얼 인스턴스가 생성되어 GPU Instancing이 깨지게 됩니다.
GPU Instancing을 사용하면서 MaterialPropertyBlock (MPB)을 이용해 오브젝트의 머티리얼 속성을 변경해야합니다. 이 방법은 머티리얼 인스턴스를 새로 생성하지 않으므로, GPU Instancing의 이점을 유지할 수 있습니다.
using UnityEngine;
public class ChangeColorCorrectly : MonoBehaviour
{
public Renderer cubeRenderer;
void Start()
{
// MaterialPropertyBlock 인스턴스를 생성합니다.
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
// MPB에 색상을 설정합니다.
mpb.SetColor("_Color", Color.red);
// 설정된 MPB를 렌더러에 적용합니다.
cubeRenderer.SetPropertyBlock(mpb);
}
}
C#
복사
Material Property Block에 대한 개인적인 의견
개인적인 의견이지만, GPU Instancing을 사용하지 않더라도 웬만한 부분들은 MPB를 사용하는 것이 낫다고 생각합니다.
MPB 사용의 장점
1.
메모리 절약 : 각 오브젝트에 대해 새로운 머티리얼을 생성하지 않기 때문에, 메모리 사용량을 줄일 수 있습니다.
a.
이 부분은 GPU Instancing을 사용하지 않더라도 새로운 머티리얼을 생성하지 않기 때문에, 메모리 절약적인 측면에서 매우 유용하다 생각합니다.
2.
성능 향상 : MPB를 사용하여 렌더링 속성을 변경하면, 렌더링 파이프라인에서 오브젝트별로 머티리얼 설정을 변경하는 과정이 최적화됩니다.
a.
머티리얼이 하나로 통합되어 있으므로, 새로운 머티리얼 설정을 변경하는 것보다는 MPB를 사용하여 하나의 머티리얼 설정을 변경하는 것이 더 최적화되는 과정입니다.
b.
이 것 자체가 CPU → GPU 사이의 데이터 전송을 줄일 수 있는 방법입니다.
동적 배칭과의 차이점
일반적으로 최적화는 단 한 가지 최적화 기법만을 사용하지 않습니다.
GPU 인스턴싱, 동적 배칭, 정적 배칭, SRP 배칭 등과 같은 다양한 최적화 기법을 동시에 사용하여 이루어집니다.
GPU 인스턴싱과 가장 비슷하면서 헷갈려하시는 부분은 동적 배칭과의 차이점이라 생각합니다.
동적 배칭
•
적용 조건: 오브젝트가 특정 크기(정점 수) 이하이고, 동일한 머티리얼을 사용해야 합니다
GPU 인스턴싱
•
적용 조건: 동일한 메시와 머티리얼을 사용하며, 머티리얼과 셰이더에서 인스턴싱이 활성화되어 있어야 합니다.
이러한 차이점으로 동적 배칭과 GPU 인스턴싱을 동시에 사용하죠.
동시 적용
GPU 인스턴싱과 동적 배치를 동시에 적용하는 것은 불가능합니다.
Unity는 렌더링을 최적화하기 위해 이 두 기법 중 하나를 자동으로 선택합니다. 이 선택은 오브젝트의 특성과 현재 렌더링 환경에 따라 결정됩니다.
간단히 말하면, Unity가 최적화를 위해 더 적합한 방식을 자동으로 선택한다고 이해하시면 됩니다.