그래픽스/최적화

Unity 렌더링 최적화의 기본 공식

유니티세상 2025. 6. 17. 13:39

Unity 성능 최적화에서 자주 쓰이는 5가지 기술

 

✅ 1. Frustum Culling

📌 카메라 시야(FOV) 밖에 있는 오브젝트는 그리지 않음

  • Unity는 카메라의 시야각(FOV, Frustum) 안에 들어오는 오브젝트만 렌더링해.
  • 자동으로 동작하며, MeshRenderer 기준으로 처리함.
  • 성능 효과: 안 보이는 오브젝트의 드로우콜, 지오메트리, 픽셀 연산을 아예 생략할 수 있음.

🧠 예시:

  • 카메라가 오른쪽을 보고 있을 때, 왼쪽 뒤에 있는 건 그릴 필요 없음 → 자동 생략됨.

✅ 2. Occlusion Culling

📌 카메라에 보이긴 하지만, 다른 오브젝트에 가려진 건 그리지 않음

  • 벽 뒤에 있는 오브젝트, 산 뒤에 있는 건물처럼 시야는 있지만 완전히 가려진 것들을 생략함.
  • Frustum Culling보다 더 고급 기술이며, **Bake(굽기)**가 필요함.
  • 카메라 움직임/시점에 따라 자동 판단

🧠 예시:

  • 벽 뒤에 수많은 적 유닛이 있는데 전혀 안 보이면 → 렌더링 생략

✅ Unity 사용법:

  • Window > Rendering > Occlusion Culling
  • Static 오브젝트 설정 + 베이크 필요

✅ 3. LOD (Level of Detail)

📌 멀리 있는 오브젝트는 저해상도 메쉬로 교체

  • 가까이 있으면 고해상도, 멀어지면 낮은 퀄리티의 모델로 자동 전환
  • 메모리/연산을 아끼고 FPS를 높여줌
  • 각 거리 단계에 따라 LOD0 → LOD1 → LOD2 → Culled로 점점 생략 가능

🧠 예시:

  • 가까운 나무는 리얼한 잎사귀까지 표현하지만,
  • 멀리 있는 나무는 단순한 형태만 보여줘도 충분

✅ Unity 사용법:

  • GameObject에 LOD Group 컴포넌트 추가

✅ 4. Static Batching / Dynamic Batching

📌 여러 오브젝트를 하나의 드로우콜로 묶어서 처리

  • Static Batching: 움직이지 않는 오브젝트들을 미리 합쳐서 그리기
    • 예: 건물, 지형, 벽
    • Static 체크 후 Build 시 자동 적용
  • Dynamic Batching: 움직이지만 동일 머티리얼을 사용하는 작은 오브젝트들을 런타임에서 묶기
    • 예: 불꽃, 총알 등 작은 반복 객체
    • Draw Call 줄이기엔 좋지만, 조건이 많음 (버텍스 수, 쉐이더 등 제한)

🧠 핵심:

  • 드로우콜을 줄여서 CPU 명령 부담을 줄임

✅ 5. GPU Instancing

📌 같은 오브젝트 여러 개를 GPU에서 한 번에 처리

  • 같은 메쉬/머티리얼을 쓰는 오브젝트를 복수로 렌더링할 때,
  • GPU가 각 오브젝트를 복사하지 않고 인스턴싱 처리
  • 예: 1000개의 나무를 GPU가 한 번에 처리 가능 (1 드로우콜)

✅ Unity 사용법:

  • 머티리얼의 "Enable GPU Instancing" 체크
  • 코드에서 Graphics.DrawMeshInstanced() 등 사용

🧠 전체 비교 요약표

기술명 작동 대상 언제 유용함 효과
Frustum Culling 시야 밖 오브젝트 항상 (자동 작동) 기본적인 렌더링 생략
Occlusion Culling 가려진 오브젝트 복잡한 실내/건물 게임 추가 렌더링 생략으로 GPU 부담 완화
LOD 거리 기반 모델 멀리 있는 수많은 오브젝트 버텍스/쉐이더 연산 절감
Static/Dynamic Batching 머티리얼 공유 오브젝트 오브젝트 많고 변하지 않을 때 드로우콜 수 감소
GPU Instancing 같은 메쉬 반복 객체 대규모 복제 오브젝트 (예: 나무, 병사) GPU 연산 효율화, 드로우콜 최소화

 

Unity 최적화 기술 사용 시 주의할 점

✅ 1. Frustum Culling

  • ✔️ Unity가 자동으로 처리하므로 따로 손댈 필요 없음
  • 주의점 없음, 하지만 커스텀 카메라/셰이더에서 수동 처리 시 누락 주의

✅ 2. Occlusion Culling

  • Static으로 설정된 오브젝트만 적용됨
    • 움직이는 오브젝트엔 적용되지 않음
  • ❗ **베이크(Bake)**가 필요하며,
    • 씬이 바뀔 때마다 다시 베이크해야 함
  • 씬 구조가 잘못되면 오히려 가려지지 않는 오브젝트를 생략해서 오류 발생

🧠 : 실내/건물 중심 게임에 효과적이고, 야외/플랫한 월드에선 큰 효과 없음


✅ 3. LOD (Level of Detail)

  • LOD 전환이 눈에 띄게 보이면 품질 저하로 느껴짐
    • 전환이 너무 가까우면 팝핑 현상(pop-in)
  • ❗ LOD 모델을 직접 만들어야 할 수도 있음 (시간 소요)
  • ❗ 쉐이더/라이트가 다른 LOD 레벨끼리 맞지 않으면 시각적 이질감 발생

🧠 : LOD Group에 Fade 설정을 켜면 부드러운 전환 가능 (쉐이더 지원 필요)


✅ 4. Static Batching / Dynamic Batching

  • Static Batching은 빌드 이후 메모리 증가 가능성
    • Mesh 데이터를 하나로 합치기 때문에 메모리 사용량 ↑
  • Dynamic Batching은 조건이 매우 까다로움
    • 버텍스 수 300 이하, 동일 머티리얼, 동일 쉐이더, 동일 라이트 조건 등
    • 조건에 안 맞으면 오히려 추가 오버헤드

🧠 :

  • Static은 움직이지 않는 배경물,
  • Dynamic은 소형, 반복적 오브젝트에만 적용

✅ 5. GPU Instancing

  • 각 인스턴스의 데이터(색상, 위치 등)를 따로 지정하려면 추가 셰이더 작성 필요
  • ❗ 머티리얼마다 “Enable GPU Instancing” 체크 필요 (기본 Off)
  • 커스텀 셰이더를 쓸 경우 인스턴싱 지원 안 되면 작동하지 않음

🧠 :

  • 대규모 동일 오브젝트(나무, 병사, 돌멩이 등)에 매우 효과적
  • 각 인스턴스마다 데이터가 다르다면 MaterialPropertyBlock 등을 활용

📌 요약: 기술별 주의 포인트 정리

기술명 주의할 점 요약
Occlusion Culling Static 설정 필수, Bake 필요, 잘못하면 렌더링 오류 발생
LOD LOD 전환이 눈에 띌 수 있음, 팝핑 현상 주의
Static Batching 메모리 증가 가능성, 움직이는 오브젝트는 적용 불가
Dynamic Batching 조건 엄격 (버텍스 수, 머티리얼 동일 등), 적용 실패 위험
GPU Instancing 셰이더/머티리얼 설정 필요, 개별 데이터 커스터마이징 어려움
Frustum Culling 자동 적용, 커스텀 카메라에서만 누락 주의