Unity/Study

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

VR하는소년 2024. 9. 2. 08:00

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

 

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

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


연산 순서 이해하기

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에 더합니다.

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


정리

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

 

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

 

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