유니티 최적화 : 스크립트 최적화

 

기본적인 내용들도 있지만, 상기시키자는 의미로 나열해보았다.

 

 

1. 처리에 부하를 주는 Unity API를 피하자

SendMessage()

리플렉션을 사용하기 때문에 비용이 크다. 가급적 Event와 Delegate를 사용하자.

 

Find()

게임 월드 내의 모든 오브젝트를 탐색하기 때문에 프로젝트가 커지면 커질수록 비용이 크게 증가한다.

 

Transform

트랜스폼을 변화시키면 해당 오브젝트의 모든 자식들에게 OnTransformChanged 이벤트가 전파된다.

여러 계산을 통해 트랜스폼을 변화시킨다면 따로 적용하지 말고, 모든 계산이 끝난 뒤 최종 값을 적용하자.

아래의 예는 SetPositionAndRotation을 통해 두 번의 트랜스폼 메시지를 한 번으로 최적화할 수 있다.

// 트랜스폼이 두 번 변한다.
transform.position = Vector3.one;
transform.rotation = Quaternion.identity;

// 트랜스폼이 한번에 적용된다.
transform.SetPositionAndRotation(Vector3.one, Quaternion.identity);

Transform.localPosition은 트랜스폼 내부에 캐싱되지만 Transform.Position은 가져올 때마다 계산되기 때문에 훨씬 무겁다. Transform.Position을 자주 사용한다면 가능한 한 캐싱하도록 하자.

 

 

2. 빈 이벤트 함수는 호출하지 말자

Update(), LateUpdate()등의 이벤트함수는 실행 전 내부적으로 안전검사(유효한 게임 오브젝트인지 등)를 수행한다.

때문에 Update() 가 비어있더라도 호출되는 것 자체가 CPU 리소스를 낭비하게 된다.

비어있는 Update문은 반드시 제거하도록 하자.

Update() 최적화
업데이트 문을 호출하는 것 자체가 리소스를 낭비하기 때문에, 업데이트를 외부에서 관리자 클래스가 호출하는 방식을 취하면 CPU 자원을 아낄 수 있다. 다음 링크에서 영향을 확인할 수 있다.

 

 

3. 벡터의 대소를 비교할 때는 sqrMagnitude를 사용하자

플레이어를 기준으로 두 몬스터 중 어느 몬스터가 더 가까운가? 는 어느 게임에서나 사용되는 계산식이다.

플레이어로부터 각 지점의 벡터 값을 뺀 뒤, 벡터의 크기(magnitude)를 통해 거리의 대소를 비교할 수 있다.

 

벡터의 크기를 계산할 때는 삼각함수를 통해 제곱근을 계산한다.

c^2 = a^2 + b^2으로 C^2를 구하고, C^2의 제곱근을 구하기 위해 루트 함수를 사용하게 된다.

 

하지만 k^2와 j^2의 대소 관계가 k^2 > j^2 라면, 그 제곱근인 k > j의 관계도 성립한다.

따라서 단순히 거리 비교를 하기 위해서라면 제곱근을 구하지 말고 ^2 상태에서 비교하는 것이 좋다.  

 

거리의 대소 비교에서는 Vector3.magnitude 대신 Vector3.sqrMagnitude를 사용하자.

 

 

4. 보이지 않는 객체는 계산하지 말자

Renderer의 isVisible 속성을 통해 화면 상에 보이는 객체인지 확인 후,

보이지 않는다면 트랜스폼 이외의 처리를 하지 않는 방법도 존재한다.

애니메이션의 바운더리가 클 경우 문제가 되는 경우도 있으니 주의할 것.

public class Monster : MonoBehaviour
{
    private Renderer myRenderer;

    void Start()
    {
        myRenderer = GetComponent<Renderer>();
    }

    void Update()
    {
        UpdateTransformPosition();

        if (myRenderer.isVisible)
        {
            UpateAnimations();
        }
    }
}

 

 

 

댓글

Designed by JB FACTORY