Skip to content

Culling 최적화

Chanyoung "Lazuward" Park edited this page May 23, 2024 · 20 revisions

개요 / Abstract

Culling 최적화는 플레이어의 시야를 벗어나는 오브젝트를 유니티 render pipeline에서 배제하는 기법이다.

오브젝트 당 1개의 BoundingSphere가 생성되며, 해당 구체가 시야에서 벗어나면 개체는 비활성화되어 렌더링되지 않는다.

화면을 차지하는 오브젝트 크기에 따라 메쉬 퀄리티를 점진적으로 낮추는 LOD와 달리, Culling 기법을 적용하면 일정 거리 혹은 시야에서 벗어날 때 오브젝트를 제거한다는 특징이 있다.

  • 장점: 오브젝트 1개마다 여러 LOD 버전에 대응하는 메쉬를 만들 필요가 없다 (간편한 적용)
  • 단점: 사물이 일정 거리를 벗어나면 갑자기 사라진다 (거리를 충분히 높이면 해결)

사용법 / Usage

Culling Target

  1. 최적화 기법을 적용할 오브젝트를 모아서 하나의 부모에 묶는다
  2. 해당 부모 오브젝트에 CullingTarget 컴포넌트를 추가한다 (본 예시의 경우 Rock)

image image

Culling Optimizer

  1. 빈 오브젝트를 만든다 (본 예시의 경우 Misc > Culling)
  2. CullingOptimizer 컴포넌트를 추가한다
  3. 플레이어 시점 카메라를 Camera 항목에 추가한다
  4. 이전 단계에 추가했던 CullingTargetTargets 항목에 등록한다. (+ 버튼)

image image

게임을 시작하면 최적화 대상 오브젝트(BoundingSphere) 갯수가 콘솔 화면에 표기된다.

image

오브젝트 렌더링 거리제한은 Rendering Distance에서 설정 가능하다.

Display Markers 옵션을 체크하면 오브젝트 Culling 여부를 육안으로 확인할 수 있다.

image

주의사항 / Caveat

Culling 대상 오브젝트를 판별하는 연산은 오브젝트 수에 비례한다.
플레이어가 시야를 회전할 때 오브젝트가 깜빡거리는 현상을 제거하기 위해 연산 주기도 짧아야 한다.
너무 많은 BoundingSphere를 한꺼번에 최적화하면 Culling으로 얻는 프레임 향상보다 연산비용이 높아지고
성능이 도리어 나빠지는 결과를 초래한다.

최적화 미적용

  • 평균 54 fps

image

오브젝트 8400개

  • 평균 59 fps

image

오브젝트 33400개

  • 평균 44 fps

image

해결책

  • 렌더링 거리 옵션을 낮추면 활성 오브젝트 수가 크게 줄어든다 → 두드러진 성능 향상
  • 최적화가 불필요하거나 자식 오브젝트가 너무 많은 경우 CullingTarget에서 배제시킨다
  • 근본적인 해결책을 위해 CullingOptimizer v2 스크립트를 개발중