Unity성능과 프로파일링

NonAlloc 물리 쿼리 기본

반복적인 Overlap과 Raycast 결과 수집에서 GC 할당을 줄이기 위한 Unity NonAlloc 쿼리 패턴입니다.

마지막 수정 2026년 3월 19일

기본 패턴

csharp
private readonly Collider[] results = new Collider[16];
int hitCount = Physics.OverlapSphereNonAlloc(transform.position, radius, results);

설명

  • Unity 공식 물리 성능 가이드는 배열을 새로 만드는 할당형 쿼리보다 NonAlloc 버전을 우선 고려하라고 설명합니다.
  • OverlapSphere, OverlapBox처럼 여러 결과를 돌려주는 API는 자주 호출되면 GC 부담이 쌓일 수 있습니다.
  • NonAlloc API는 결과 버퍼를 호출자가 직접 제공하므로 추가 할당 없이 재사용할 수 있습니다.
  • 2D 물리에서는 NonAlloc 이름 대신 배열이나 List<T>를 받는 overload를 쓰는 방식이라는 점도 중요합니다.

짧은 예제

csharp
[SerializeField] private float detectRadius = 3f;
private readonly Collider[] hits = new Collider[32];

private void Update()
{
    int count = Physics.OverlapSphereNonAlloc(transform.position, detectRadius, hits);

    for (int i = 0; i < count; i++)
    {
        if (hits[i].CompareTag("Enemy"))
        {
            Debug.Log(hits[i].name);
        }
    }
}

빠른 정리

항목설명
NonAlloc호출 중 추가 GC 할당을 줄임
결과 버퍼미리 만든 배열을 재사용
반복 쿼리탐지 시스템, AI 감지에 유용
2D 예외배열/List overload로 같은 목적 달성
버퍼 크기부족하면 일부 결과를 놓칠 수 있음

주의할 점

NonAlloc으로 바꿨더라도 결과 버퍼가 너무 작으면 충돌 대상을 일부 놓칠 수 있습니다. 성능 최적화와 정확도 사이의 최소 버퍼 크기를 실제 장면에서 검증해야 합니다.

참고 링크

2 sources