[Unity] 물리 탐지 함수 최적화(All, NonAlloc)
개요
[Unity] 물리 탐지 함수(Ray, Sphere, Box, Capsule)
이전 글에서는 Unity의 물리 탐지 함수인 Cast, Overlap, Check의 차이점을 알아봤다.
이번에는 여러 충돌체를 탐지하는 All과 메모리 할당을 줄이는 NonAlloc에 대해 알아보자.
1. All
All은 탐지 범위에 있는 여러 충돌 결과를 배열로 반환하는 함수이다.
RaycastHit[] hits = Physics.RaycastAll(
transform.position,
transform.forward,
10f
);
- Raycast: 가장 가까운 충돌체 하나의 정보를 반환
- RaycastAll: 경로에 있는 여러 충돌 결과를 배열로 반환
All은 호출할 때마다 새로운 배열을 생성할 수 있어 반복적으로 사용하면 GC 부담이 발생할 수 있다.
2. NonAlloc
NonAlloc은 미리 생성한 배열을 재사용하여 불필요한 메모리 할당을 줄이는 방식이다.
RaycastHit[] hits = new RaycastHit[10];
int count = Physics.RaycastNonAlloc(
transform.position,
transform.forward,
hits,
10f
);
- 미리 생성한 배열에 충돌 결과 저장
- 실제 탐지된 결과 개수를 int로 반환
- 배열을 재사용하여 GC Alloc 감소
단, 배열 크기를 초과하는 충돌 결과는 모두 저장할 수 없으므로 적절한 배열 크기를 설정해야 한다.
3. Unity 6에서의 사용
Unity 6에서는 일부 NonAlloc 함수 대신 결과 배열을 매개변수로 받는 오버로드를 사용할 수 있다.
RaycastHit[] hits = new RaycastHit[10];
int count = Physics.Raycast(
transform.position,
transform.forward,
hits,
10f
);
기존 RaycastNonAlloc과 마찬가지로 배열을 재사용하여 메모리 할당을 줄일 수 있다.
정리
| 구분 | All | NonAlloc 방식 |
|---|---|---|
| 결과 | 새 배열 반환 | 기존 배열에 저장 |
| 메모리 할당 | 호출 시 발생 가능 | 결과 배열 재사용 |
| 반환값 | 배열 | 탐지 개수(int) |
| 주의점 | 반복 호출 시 GC 부담 | 배열 크기 제한 |
물리 탐지를 자주 수행하는 게임에서는 배열을 재사용하는 방식으로 불필요한 GC Alloc을 줄일 수 있다.
이전 프로젝트 최적화 글에서도 NonAlloc 방식을 활용하여 GC Alloc을 줄였다
다만 모든 상황에서 NonAlloc 방식이 필요한 것은 아니며, 실제 성능은 Unity Profiler를 통해 확인하는 것이 좋다.


