Unity/최적화

[Unity/최적화] 05. Vector 간 거리를 비교할 때는 sqrMagnitude를 사용하자

virtus 2023. 3. 22. 22:51
728x90

문제

두 점 간의 거리는 각 요소(x, y, z) 의 차를 제곱한 다음 더한 값에 루트를 씌운 값이다. 게임에서도 이 공식을 사용해야할 때가 자주 있다. 이때 정확한 거리값이 필요하다면 이 공식을 사용하지만, 일정 거리 내 들어왔다던가하는 단순 비교에는 굳이 루트를 취하지 않아도 계산이 가능하다. 차원이 달라도 점 간 거리 공식은 같기 때문에 Vector3뿐만 아니라 Vector2, Vector4에도 모두 해당된다.

 

해결방안

따라서 이런 상황에서는 Vector3.Distance 또는 Vector3.magnitude보다는 Vector3.sqrMagnitude를 사용한다. 참고로 sqrMagnitude는 square root of Magnitude가 아니라, square of Magnitude이다.

UnityCsReference에는 다음과 같이 구현되어있다. 링크

public float magnitude
{
	get 
	{
		return (float)Math.Sqrt(x * x + y * y + z * z); 
	}
}
public static float SqrMagnitude(Vector3 vector) 
{ 
	return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
}

보면 알겠지만 Math.Sqrt연산을 해서 반환하므로 더 느리다. 

당연한 사실이지만 놓칠 수도 있는 점은, 거리비교를 할 때 비교한 값도 제곱한 값이여야 한다!

Vector3 offset = other.position - transform.position;
float sqrLen = offset.sqrMagnitude;

// 비교할 거리값을 제곱해준다.
if (sqrLen < closeDistance * closeDistance)
{
	print("The other transform is close to me!");
}

 

출처

Unity - Scripting API: Vector3.sqrMagnitude

 

728x90