본문 바로가기

카테고리 없음

Unity GPU Instancing

GPU Instancing은 동일한 MeshMaterial을 사용하는 여러 개의 객체를 한 번의 드로우 콜로 렌더링하는 최적화 기술입니다. 이를 통해 CPU와 GPU 간의 병목 현상을 줄이고 성능을 향상시킬 수 있습니다.

 

GPU Instancing을 사용해야 하는 이유

  1. 드로우 콜 감소 → CPU가 렌더링 요청을 줄여 프레임 속도 향상
  2. CPU 사용량 절감 → CPU에서 개별 객체를 처리하는 대신 한 번의 인스턴스로 처리
  3. 대량의 객체 렌더링 가능 → 나무, 풀, 총알 등 동일한 객체를 다량 배치할 때 유용

GPU Instancing 활성화 방법

머티리얼(Material)에서 Instancing 활성화

  1. Material을 선택
  2. 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을 적절히 사용하면 게임의 퍼포먼스를 크게 개선할 수 있습니다! 🚀🔥