반응형 유니티/프로젝트 최적화 [Unity] 스크립팅 최적화 (5) - 트랜스폼 (Transform) 2023. 5. 24. 스크립팅에서의 트랜스폼이란? 언리얼의 씬 컴포넌트와 마찬가지로 유니티는 트랜스폼 컴포넌트가 씬에 배치된 오브젝트의 크기/방향/위치 등을 조작할 수 있는 유일한 수단이다. 따라서 그만큼 스크립트에서 자주 사용하게 되는데, 많이 사용하는 만큼 최적화할 방법이 있을까? 트랜스폼 캐싱 (GameObject.transform vs transform caching) 일반적인 트랜스폼의 접근은 다음과 같다. public GameObject player; void Start() { player.transform = DoSomething(); } 하지만 Update 내부처럼 아주 많이 사용되는 경우 다음과 같이 캐싱해두는것도 고려해봐야 한다. public GameObject player; private Transform.. [Unity] 스크립팅 최적화 (4) - 빈 이벤트 콜백 제거 2023. 5. 19. 이벤트 콜백 함수란? 유니티에서 MonoBehaviour로 스크립트를 생성하면 기본적으로 제공되는 두 가지 이벤트 콜백 함수가 있다. Start와 Update가 그것인데, 만약 사용하지 않는다면 지워주는 것이 좋다. 왜냐면 내부 시스템이 빈 이벤트 함수들을 계속 호출하기 때문이다. 아무것도 들어있지 않은 함수를 사용하기 위해 매번 호출하는데 일을 시킬 필요가 있을까. // Use this for initialization void Start () { } // Update is called once per-frame void Update () { } 위처럼 함수가 비어있다면 함수를 지워주는 것을 습관화하도록 하자. [Unity] 스크립팅 최적화 (3) - 두 지점 사이 거리 비교 2023. 5. 18. Vector3.Distance와 Vector3.SqrMagnitude 두 지점 사이의 거리를 측정하는 방법은 여러 방법이 있지만 그중 주의 깊게 살펴봐야 하는 Vector3.Distance와 Vector3.SqrMagnitude에 대해 비교하고자 한다. 우선 Vector3.Distance(a, b)는 두 지점 a와 b 사이의 거리를 반환한다. 반면 Vector3.SqrMagnitude(a, b)는 두 지점 a와 b사이의 거리의 제곱을 반환한다. 우리는 정확한 거리를 알려주는 Vector3.Distance를 사용하면 될까? 높은 비용의 제곱근 연산 문제는 Vector3.Distance가 제곱근 연산을 포함하고 있다는데에 있다. 두 지점 사이의 거리는 곱셈과 루트 연산이 들어가는데, CPU는 곱셈에는 강하지.. [Unity] 스크립팅 최적화 (2) - GameObject의 문자열 프로퍼티 2023. 5. 17. GameObject에서 정보 가져오기 유니티 게임오브젝트에서 해당 오브젝트의 정보를 문자열로 알아내는 방법은 두 가지가 있다. 바로 문자열 프로퍼티, tag와 name이다. 그런데 유니티 공식 문서에서는 해당 프로퍼티의 사용을 조심하라고 한다. 이것이 왜 문제가 된다는 것일까? 문자열 프로퍼티의 전달 방식 문제는 게임오브젝트의 name과 tag가 문자열 객체를 생성한 뒤 전달한다는 것으로부터 출발된다. 이 때문에 비교할 때마다 GC가 할당되고 이는 프레임 드랍으로 이어진다. (아래의 예시에서 GC Spike를 볼 수 있다.) 다행히 name은 런타임 중에 자주 사용할 일이 없다. 그러나 tag의 경우 얘기가 다르다. 오브젝트 비교를 위해 흔히 사용되는 것이 tag이다. 그렇다면 이러한 위험성을 감수하고 .. [Unity] 스크립팅 최적화(1) - 반복되는 연산 줄이기 2023. 5. 12. 반복되는 구간 줄이기? 유니티에서 컴포넌트 스크립팅을 하다 보면 필연적으로 반복되는 구간이 나오게 된다. 예를 들어, Update이벤트에서 사용되는 함수가 대표적인 경우이다. 그중 몇 개는 매프레임마다 반드시 실행되어야 하지만 최초 1회 혹은 특정 순간만 필요한 경우일 때도 많다. 후자의 상황인 경우 우리는 불필요한 연산을 줄이도록 스크립팅을 해야 한다. 반복으로부터 발생하는 비용을 없앨 수 있을까? 많은 방법이 있지만 대표적으로 다음과 같은 방법을 사용할 수 있다. 컴포넌트 캐싱 캐싱은 스크립트 최적화의 기본이 되는 아주 중요한 개념이다. 유니티에서는 특별히 "GetComponent()"함수와 자주 사용되는데, 이는 GetComponent가 CPU 오버헤드를 일으킬 수 있는 반면, 캐싱이 이를 해결하기.. 이전 1 다음 1/1 반응형