GameDev/[Unity]
[유니티]Unity 최적화 팁: Vector3.Distance와 sqrMagnitude의 차이와 활용법
Bit by Bit
2024. 11. 18. 07:33
728x90
Unity에서 두 점 사이의 거리를 계산할 때 주로 사용되는 함수는 **Vector3.Distance**와 **sqrMagnitude**입니다. 이 둘은 같은 목적(거리 계산)을 가지고 있지만, 사용 방식과 성능에 차이가 있습니다. 이 글에서는 이 두 방법을 비교하고, 상황에 맞는 최적의 선택법을 알아보겠습니다.
1. 두 함수의 기본 원리
(1) Vector3.Distance
Vector3.Distance는 유클리드 거리(Euclidean Distance) 공식을 사용해 두 점 사이의 정확한 거리를 반환합니다.
- Unity 코드:
float _distance = Vector3.Distance(pointA, pointB);
이 함수는 내부적으로 제곱근(√) 연산을 포함하고 있어, 정확한 거리 값을 제공하지만 연산량이 비교적 큽니다.
(2) sqrMagnitude
sqrMagnitude는 거리의 제곱 값을 반환하며, 제곱근 계산을 생략해 연산 속도를 높입니다.
- Unity 코드:
float _sqrDistance = (pointA - pointB).sqrMagnitude;
이는 거리 비교나 범위 내 검사를 할 때 정확한 거리 값 대신 상대적 거리만 필요할 경우 사용됩니다.
2. 성능 비교: 왜 sqrMagnitude가 빠를까?
제곱근(√) 연산은 CPU 연산 중에서도 비용이 큰 작업입니다. 특히, 많은 객체에 대해 반복적으로 거리를 비교해야 하는 경우, 제곱근 연산을 생략한 **sqrMagnitude**를 사용하면 성능을 크게 향상시킬 수 있습니다.
성능 최적화 예제: 반경 내 오브젝트 탐지
Vector3.Distance를 사용한 경우:
float _distance = Vector3.Distance(pointA, pointB);
if (_distance <= radius)
Debug.Log("pointB는 반경 내에 있습니다.");
sqrMagnitude를 사용한 경우:
float _sqrRadius = radius * radius; // 반지름의 제곱
float _sqrDistance = (pointA - pointB).sqrMagnitude; // 거리의 제곱
if (_sqrDistance <= _sqrRadius)
Debug.Log("pointB는 반경 내에 있습니다.");
- 차이점: sqrMagnitude는 제곱근 연산을 생략하기 때문에 성능이 더 효율적입니다.
- 적용 상황: 다수의 오브젝트를 비교하는 루프에서 유리합니다.
3. 언제 Vector3.Distance와 sqrMagnitude를 사용할까?
sqrMagnitude를 사용하는 것이 더 나은 상황
- 거리 비교가 목적일 때: 정확한 거리 값이 아니라, 두 점 사이의 거리가 특정 값보다 작거나 큰지를 확인하려는 경우.
- 예: 적 탐지 범위 내의 타겟 찾기, 충돌 감지 등.
- 대규모 연산이 필요한 경우: 많은 오브젝트를 대상으로 반복적으로 거리 계산을 수행할 때 성능이 중요한 경우.
- 예: 100개 이상의 오브젝트를 루프에서 비교할 때.
Vector3.Distance가 더 나은 상황
- 정확한 거리 값이 필요한 경우: 거리 자체를 표시하거나, UI에 출력해야 하는 경우.
- 예: "목적지까지의 거리: 5.43m"와 같은 정보 제공.
- 코드 가독성이 중요한 경우: Vector3.Distance는 제곱근 연산을 포함하므로, 코드가 직관적이고 이해하기 쉽습니다.
- 예: 간단한 프로토타입 작성 시.
- 성능이 크게 중요하지 않은 경우: 소규모 데이터셋(예: 10~20개 이하)에서 거리 계산이 드물게 이루어지는 경우.
4. 성능 테스트 결과
- 테스트 환경: 1,000,000번 반복 실행.
- 결과:
- Vector3.Distance: 약 45ms
- sqrMagnitude: 약 30ms
- 결론: 대규모 반복 연산에서 sqrMagnitude가 약 33% 더 빠름.
5. 최종 정리: 선택 가이드라인
거리 비교(성능 최적화 중요) | sqrMagnitude | 제곱근 계산 생략으로 연산 속도 향상. |
정확한 거리 값이 필요할 때 | Vector3.Distance | 거리 값을 직관적으로 계산하고 사용 가능. |
적은 데이터셋에서 간단한 거리 계산 | Vector3.Distance | 간결한 코드로 빠르게 구현 가능. |
실시간 탐지 범위 확인 | sqrMagnitude | 다수의 오브젝트 처리 시 효율적. |
Unity 최적화를 위해 Vector3.Distance와 sqrMagnitude의 차이를 이해하고 올바른 상황에서 사용하는 것이 중요합니다.
더 많은 Unity 팁과 정보들이 계속 업데이트될 예정입니다. 도움이 되셨다면 구독과 좋아요, 공유 부탁드립니다!🎮
728x90