유니티내의 모든 오브젝트들은 트랜스폼(Transform)이라는 컴포넌트를 가지고있다.

물론 모든 오브젝트가 가지고 있는 만큼 수정도 빈번하다.

C#스크립트에서 트랜스폼 변경시 유니티엔진은 

C++코드인 "OnTransformChange"라는 함수를 호출하게 되고

이 함수는 다시 유니티 hierarchy상의 자식들에게 

C#코드로 "OnBeforeTransformParentChanged", "OnTransformParentChanged"

와 같이 변경전과 변경후에 메시지를 보내게 된다.

이외에 물리, 렌더러, UI등에 영향을 미치게 된다.

자신의 프로젝트엔 트랜스폼 변경이 빈번하지 않다고 생각 할 지라도 한번 짚고 넘어가는것이 좋은 이유가

보통의 3D 모델의 경우 수많은 본들이 결합되어있기 때문이다.

가령 유니티짱만 하더라도 150개의 트랜스폼을 가지고 있다고 한다.

이렇게 부하가 걸린다는것은 알았으니 최적화를 알아보자.


첫번째로, 포지션과 로테이션을 같이 세팅하는 경우이다. (5.6.1Ver 이상)

transform.position += new Vector3(x,y,z);

transform.rotation += Quaternion.Euler(a,b,c);

와 같이 변경하는 경우가 많은데 이 것을

transform.SetPositionAndRotation(

transform.position + new Vector3(x,y,z);

transform.rotation + Quaternion.Euler(a,b,c);

);

와 같이 수정하게 되면 위치와 회전 각각 메시지를 보내던 흐름을 하나의 메시지로 줄 일수 있게된다.

이론적으론 2배의 성능향상을 기대할 수 있다고한다.


두번째로, 모델의 임포트세팅에서 Rig탭의 Optimize Game Objects의 체크박스를 활성화 시키는것이다.

이것은 수많은 자식들의 본을 유니티 엔진 내에서 멀티쓰레드로 돌릴수있게 데이터를 재배치 하게된다.

(2017Ver 이후 부터는 기본적으로 기능이 탑재되있다고한다.)

기본적으로 싱글 쓰레드로 돌아가는 유니티에서 이것은 꽤 필요한 기능이라고 생각한다.

또 하나의 차이점은 유니티 에디터의 hierarchy상에서 사용하지않는 본을 모두 숨길수가 있다.

당연히 attach가 필요한 경우 특정 본의 오브젝트를 표시하는것도 가능하다.


출처 : https://youtu.be/cSwB2brGVPY (Unity Korea You Tube)

+ Recent posts