-
Notifications
You must be signed in to change notification settings - Fork 0
Culling 최적화
Chanyoung "Lazuward" Park edited this page May 23, 2024
·
20 revisions
Culling 최적화는 플레이어의 시야를 벗어나는 오브젝트를 유니티 render pipeline에서 배제하는 기법이다.
오브젝트 당 1개의 BoundingSphere가 생성되며, 해당 구체가 시야에서 벗어나면 개체는 비활성화되어 렌더링되지 않는다.
화면을 차지하는 오브젝트 크기에 따라 메쉬 퀄리티를 점진적으로 낮추는 LOD와 달리, Culling 기법을 적용하면 일정 거리 혹은 시야에서 벗어날 때 오브젝트를 제거한다는 특징이 있다.
- 장점: 오브젝트 1개마다 여러 LOD 버전에 대응하는 메쉬를 만들 필요가 없다 (간편한 적용)
- 단점: 사물이 일정 거리를 벗어나면 갑자기 사라진다 (거리를 충분히 높이면 해결)
- 최적화 기법을 적용할 오브젝트를 모아서 하나의 부모에 묶는다
- 해당 부모 오브젝트에
CullingTarget
컴포넌트를 추가한다 (본 예시의 경우Rock
)
- 빈 오브젝트를 만든다 (본 예시의 경우
Misc > Culling
) -
CullingOptimizer
컴포넌트를 추가한다 - 플레이어 시점 카메라를
Camera
항목에 추가한다 - 이전 단계에 추가했던
CullingTarget
을Targets
항목에 등록한다. (+ 버튼)
게임을 시작하면 최적화 대상 오브젝트(BoundingSphere) 갯수가 콘솔 화면에 표기된다.
오브젝트 렌더링 거리제한은
Rendering Distance
에서 설정 가능하다.
Display Markers
옵션을 체크하면 오브젝트 Culling 여부를 육안으로 확인할 수 있다.
Culling 대상 오브젝트를 판별하는 연산은 오브젝트 수에 비례한다.
플레이어가 시야를 회전할 때 오브젝트가 깜빡거리는 현상을 제거하기 위해 연산 주기도 짧아야 한다.
너무 많은 BoundingSphere를 한꺼번에 최적화하면 Culling으로 얻는 프레임 향상보다 연산비용이 높아지고
성능이 도리어 나빠지는 결과를 초래한다.
- 평균 54 fps
- 평균 59 fps
- 평균 44 fps
- 렌더링 거리 옵션을 낮추면 활성 오브젝트 수가 크게 줄어든다 → 두드러진 성능 향상
- 최적화가 불필요하거나 자식 오브젝트가 너무 많은 경우 CullingTarget에서 배제시킨다
근본적인 해결책을 위해 CullingOptimizer v2 스크립트를 개발중