유니티 연산 순서에 따른 성능 차이 이해하기

물리적인 이동을 구현할 때, 이동 속도를 프레임 시간과 곱해 이동 거리를 계산하는 것은 일반적인 방법입니다.

 

하지만 동일한 수식을 작성할 때, 연산 순서에 따라 성능에 차이가 발생할 수 있다는 사실을 알고 계셨나요?

코드 예시를 통해 차이를 설명하고, 최적화하는 방법을 알아보겠습니다.


연산 순서 이해하기

rigidbody.MovePosition(rigidbody.position + moveDir * Speed * Time.fixedDeltaTime);

rigidbody.MovePosition(rigidbody.position + moveDir * (Speed * Time.fixedDeltaTime));

 

이때 moveDir는 벡터(Vector)이며 Speed는 스칼라(Scala) 값입니다.

 

 

첫 번째 줄의 코드는 다음과 같은 순서로 연산이 이루어집니다.

  1. moveDir * Speed가 먼저 계산됩니다. 벡터(moveDir)와 스칼라(Speed)의 곱셈으로, 결과는 벡터입니다.
  2. 결과 벡터에 Time.fixedDeltaTime을 곱합니다. 이때도 벡터-스칼라 곱셈입니다.
  3. 결과를 rigidbody.position에 더합니다.

즉, 두 번의 벡터-스칼라 곱셈이 이루어집니다.

 

 

 

두 번째 줄의 코드는 다음과 같은 순서로 연산이 이루어집니다.

  1. Speed * Time.fixedDeltaTime이 먼저 계산됩니다. 이때는 두 개의 스칼라 값 간의 곱셈으로, 결과는 스칼라입니다.
  2. 결과 스칼라를 moveDir에 곱합니다. 벡터와 스칼라의 곱셈입니다.
  3. 결과를 rigidbody.position에 더합니다.

이때는 한 번의 벡터-스칼라 곱셈만 수행됩니다.


정리

벡터와 스칼라의 곱셈은 스칼라끼리의 곱셈보다 연산 비용이 더 큽니다.

 

벡터와 스칼라를 곱할 때 벡터의 각 성분을 각 스칼라와 곱하기 때문입니다. 이 과정은 스칼라끼리의 곱셈보다 더 복잡하고, 대규모 물리 연산이 필요한 게임에서는 큰 영향을 미칠 수 있습니다.

 

따라서, 스칼라끼리 먼저 곱한 후 그 결과를 벡터와 곱하는 것이 연산 비용을 줄일 수 있습니다.