[Unity] 물리 탐지 함수 최적화(All, NonAlloc)

muchan
muchan
∙∙조회 0

개요

[Unity] 물리 탐지 함수(Ray, Sphere, Box, Capsule)

이전 글에서는 Unity의 물리 탐지 함수인 Cast, Overlap, Check의 차이점을 알아봤다.

이번에는 여러 충돌체를 탐지하는 All과 메모리 할당을 줄이는 NonAlloc에 대해 알아보자.

1. All

All은 탐지 범위에 있는 여러 충돌 결과를 배열로 반환하는 함수이다.

csharp
RaycastHit[] hits = Physics.RaycastAll(
    transform.position,
    transform.forward,
    10f
);

  • Raycast: 가장 가까운 충돌체 하나의 정보를 반환
  • RaycastAll: 경로에 있는 여러 충돌 결과를 배열로 반환

All은 호출할 때마다 새로운 배열을 생성할 수 있어 반복적으로 사용하면 GC 부담이 발생할 수 있다.

2. NonAlloc

NonAlloc은 미리 생성한 배열을 재사용하여 불필요한 메모리 할당을 줄이는 방식이다.

csharp
RaycastHit[] hits = new RaycastHit[10];

int count = Physics.RaycastNonAlloc(
    transform.position,
    transform.forward,
    hits,
    10f
);

  • 미리 생성한 배열에 충돌 결과 저장
  • 실제 탐지된 결과 개수를 int로 반환
  • 배열을 재사용하여 GC Alloc 감소

단, 배열 크기를 초과하는 충돌 결과는 모두 저장할 수 없으므로 적절한 배열 크기를 설정해야 한다.

3. Unity 6에서의 사용

Unity 6에서는 일부 NonAlloc 함수 대신 결과 배열을 매개변수로 받는 오버로드를 사용할 수 있다.

csharp
RaycastHit[] hits = new RaycastHit[10];

int count = Physics.Raycast(
    transform.position,
    transform.forward,
    hits,
    10f
);

기존 RaycastNonAlloc과 마찬가지로 배열을 재사용하여 메모리 할당을 줄일 수 있다.

정리

구분AllNonAlloc 방식
결과새 배열 반환기존 배열에 저장
메모리 할당호출 시 발생 가능결과 배열 재사용
반환값배열탐지 개수(int)
주의점반복 호출 시 GC 부담배열 크기 제한

물리 탐지를 자주 수행하는 게임에서는 배열을 재사용하는 방식으로 불필요한 GC Alloc을 줄일 수 있다.

이전 프로젝트 최적화 글에서도 NonAlloc 방식을 활용하여 GC Alloc을 줄였다

다만 모든 상황에서 NonAlloc 방식이 필요한 것은 아니며, 실제 성능은 Unity Profiler를 통해 확인하는 것이 좋다.