Unity의 Culling Group API 소개
Culling Group API는 Unity의 LOD(레벨 오브 디테일) 파이프라인과 함께 사용자 시스템을 통합하는 방법을 제공합니다. 이 API를 사용하면 현재 카메라의 시야 안에 있는 객체만 렌더링 할 수 있어 성능을 향상시키는 데 유용합니다.
Culling Group의 사용 예제
Culling Group API는 다양한 용도로 활용될 수 있습니다. 아래는 몇 가지 활용 예시입니다:
- 군중 시뮬레이션: 보이는 캐릭터만 렌더링하여 성능 최적화
- GPU 파티클 시스템: 벽 뒤에 있는 파티클 시스템의 렌더링을 생략
- 적 스폰 관리: 카메라 뷰에서 적을 숨겨 스폰 포인트를 추적
- 거리 기반 최적화: 캐릭터가 가까운 경우 고품질 렌더링을 사용하고, 멀리 있을 경우 저품질 렌더링으로 전환
Culling Group 설정
Culling Group을 설정하려면 다음과 같은 단계를 따릅니다.
1. CullingGroup 인스턴스 생성
CullingGroup group = new CullingGroup();
2. 카메라 지정
group.targetCamera = Camera.main;
3. 바운딩 스피어 배열 설정
BoundingSphere[] spheres = new BoundingSphere[1000];
spheres[0] = new BoundingSphere(Vector3.zero, 1f);
group.SetBoundingSpheres(spheres);
group.SetBoundingSphereCount(1);
4. 가시성 계산 시작
Culling Group은 이제 매 프레임마다 단일 스피어의 가시성을 계산하기 시작합니다.
5. 메모리 해제
Culling Group을 사용 후 메모리를 해제하려면 다음을 사용합니다.
group.Dispose();
group = null;
상태 변경 콜백 사용
Culling Group의 가시성이나 거리 상태 변경을 감지하기 위해 onStateChanged 콜백을 사용합니다. 다음과 같이 설정할 수 있습니다.
group.onStateChanged = StateChangedMethod;
private void StateChangedMethod(CullingGroupEvent evt)
{
if(evt.hasBecomeVisible)
Debug.LogFormat("Sphere {0} has become visible!", evt.index);
if(evt.hasBecomeInvisible)
Debug.LogFormat("Sphere {0} has become invisible!", evt.index);
}
Culling Group 쿼리 API
가시성과 거리 결과를 가져오려면 IsVisible 및 GetDistance 메서드를 사용합니다.
bool sphereIsVisible = group.IsVisible(0);
int sphereDistanceBand = group.GetDistance(0);
여러 개의 구체 상태를 확인하려면 QueryIndices 메서드를 사용할 수 있습니다.
int[] resultIndices = new int[1000];
int numResults = 0;
// Find all visible spheres
numResults = group.QueryIndices(true, resultIndices, 0);
// Find all spheres in distance band 1
numResults = group.QueryIndices(1, resultIndices, 0);
// Find hidden spheres in distance band 2, skipping the first 100
numResults = group.QueryIndices(false, 2, resultIndices, 100);
Culling Group API 사용 시 고려사항
가시성 사용
Culling Group은 바운딩 스피어에 기반하여 가시성을 계산하므로, 퍼포먼스를 고려해 적절히 설정해야 합니다.
거리 사용
거리 밴드를 사용하여 객체의 상태를 관리하고, CPU 리소스를 효율적으로 사용할 수 있도록 하세요.
성능 및 디자인
Culling Group API는 비동기식 접근이 필요하며, 메모리 관리에 유의해야 합니다.
결론
Culling Group API는 Unity에서 효율적인 가시성 관리를 위한 강력한 도구입니다. 다양한 시나리오에 적용할 수 있으며, 적절한 디자인 및 설정을 통해 최고의 성능을 발휘할 수 있습니다.