배열에 메모리를 할당하므로 특히 자주 호출되거나 성능이 중요한 시나리오에서 가비지 수집 오버헤드가 발생할 수 있다.
광선이 닿는 모든 객체를 가져와야 하고 결과 배열을 직접 관리하고 싶지 않을 때 유용하다.
RaycastAll의 문제는 여러 충돌체를 랜덤으로 검색하는 것이다.
즉, RaycastAll에 의해 리턴 되는 정보는 물체를 통과한 레이저로써
시작점과 가까이 있는 순서대로 배열에 들어가는 것이 아니라, 실제 결과값은 예측 할 수 없는 순서로 저장된다.
만약 RaycastAll로 반환된 데이터의 순서가 중요하다면, Array.Sort 를 이용해 배열을 정렬하는 방법도 있다.
Array.Sort메서드를 사용하여 배열을 오름차순으로 정렬할 수 있다.
만약 내림차순으로 정렬하려면 Sort메서드로 반환된 것을 Reverse메서드를 활용하여 반환한다.
Physics.RaycastNonAlloc
이 함수는 와 유사 Physics.RaycastAll하지만 결과 배열에 메모리를 할당하지 않는다. 즉, 내부적으로 RaycastHit 배열을 생성하여 리턴하는 방식이 아니다.
대신, RaycastHit 객체를 저장하기 위해 사전 할당된 배열 (외부에서 이미 생성된 배열을 out 파라미터로 다시 사용할 수 있음)을 제공할 수 있다.
여러 레이캐스트에 동일한 배열을 재사용하면 가비지 수집 오버헤드를 줄이고 성능을 향상시킬 수 있다.
광선과 교차하는 RaycastHit 객체의 수를 반환한다.
불필요한 메모리 할당을 방지하므로 여러 레이캐스트를 자주 수행해야 할 때 유용하다.
RaycastAll과 마찬가지로 랜덤한 순서로 충돌된 정보의 배열을 반환한다.
효과적으로 사용하려면 LayerMask같은 기능을 활용하여 레이캐스팅 결과로 반환되는 개수가 한정적일 때 최대 길이의 배열을 사용하여 반복적인 배열을 재할당없이 사용해야 한다.
요약
Physics.RaycastAllRaycastHit 객체의 배열을 반환하고 호출될 때마다 메모리를 할당하는 반면,
Physics.RaycastNonAlloc미리 할당된 배열을 사용하고 적중 수를 반환할 수 있으므로 빈번한 메모리 할당 없이 여러 레이캐스트를 수행하는 보다 효율적인 방법을 제공한다. 성능이 중요한 시나리오에서 많은 레이캐스트를 수행해야 하는 경우 메모리 오버헤드를 최소화하고 성능을 향상시키기 위해 사용하는 것이 좋겠다.