GPU Instancing은 동일한 Mesh와 Material을 사용하는 여러 개의 객체를 한 번의 드로우 콜로 렌더링하는 최적화 기술입니다. 이를 통해 CPU와 GPU 간의 병목 현상을 줄이고 성능을 향상시킬 수 있습니다.
GPU Instancing을 사용해야 하는 이유
- 드로우 콜 감소 → CPU가 렌더링 요청을 줄여 프레임 속도 향상
- CPU 사용량 절감 → CPU에서 개별 객체를 처리하는 대신 한 번의 인스턴스로 처리
- 대량의 객체 렌더링 가능 → 나무, 풀, 총알 등 동일한 객체를 다량 배치할 때 유용
GPU Instancing 활성화 방법
머티리얼(Material)에서 Instancing 활성화
- Material을 선택
- Inspector 창에서 Enable GPU Instancing 옵션 체크
주의: Instancing이 활성화되지 않는다면 Shader가 이를 지원하는지 확인해야 합니다.
Custom Shader에서 GPU Instancing 적용
GPU Instancing을 제대로 활용하려면 Shader 코드에서 **#pragma multi_compile_instancing**을 선언해야 합니다.
Shader "Custom/InstancedShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing // Instancing 지원 활성화
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 pos : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO
};
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _Color) // 개별 인스턴스 속성 추가
UNITY_INSTANCING_BUFFER_END(Props)
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return UNITY_ACCESS_INSTANCED_PROP(Props, _Color); // 인스턴스별 색상 적용
}
ENDCG
}
}
}
GPU Instancing을 사용할 때 고려할 점
Instancing이 효과적인 경우
- 동일한 Mesh + Material을 가진 객체가 많을 때
- 개별적으로 변화할 필요가 없는 오브젝트(예: 풀, 나무, 건물 등)
Instancing이 효과적이지 않은 경우
- 각 오브젝트가 개별적인 Material을 가지고 있을 때
- Object가 서로 다른 Mesh를 사용하고 있을 때
GPU Instancing과 Batch Rendering
Unity는 GPU Instancing 외에도 여러 최적화 기법을 제공함:
- Static Batching → 움직이지 않는 오브젝트 최적화
- Dynamic Batching → 소형 Mesh(300개 미만의 Vertex)를 최적화
- SRP Batcher → Scriptable Render Pipeline에서 Instancing보다 빠른 최적화
GPU Instancing vs. SRP Batcher
- Built-in Renderer → GPU Instancing이 유용
- URP/HDRP 사용 시 → SRP Batcher가 일반적으로 더 성능이 좋음
결론: 언제 GPU Instancing을 사용할까?
- 동일한 Material을 사용하는 많은 오브젝트가 있을 때
- CPU 병목이 발생하여 드로우 콜이 많을 때
- 개별적인 Shader 속성을 컨트롤하고 싶을 때
추가 팁
- Profiler & Frame Debugger 활용하여 Instancing 적용 여부 확인
- Graphics.DrawMeshInstanced 사용하여 직접 GPU Instancing 처리 가능
- SRP를 사용하는 경우 SRP Batcher를 활용하는 것이 더 효율적일 수 있음
GPU Instancing을 적절히 사용하면 게임의 퍼포먼스를 크게 개선할 수 있습니다! 🚀🔥