Microsoft에서 제공하는 Unity 성능 추천 사항

FGPRJS·2022년 4월 22일
0

다음 링크 를 기반으로 [작성중]인 문서이다.

1. Cache 참조

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    private Camera cam;
    private CustomComponent comp;

	//첫프레임에서 호출되는 Start에서 캐싱
    void Start() 
    {
        cam = Camera.main;
        comp = GetComponent<CustomComponent>();
    }

    void Update()
    {
        // Good
        // 캐싱한 정보를 기반으로 사용하고 있다.
        this.transform.position = cam.transform.position + cam.transform.forward * 10.0f;

        // Bad
        // 캐싱을 하였음에도 불구하고 Camera.main을 또 호출해서 연산량을 늘리고 있다.
        this.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 10.0f;

        // Good
        // 캐싱한 CustomComponent를 사용한다.
        comp.DoSomethingAwesome();

        // Bad
        // 캐싱한 CustomComponent가 아니라, 또 GetComponent를 통해서 추가 연산을 부담하고 있다.
        GetComponent<CustomComponent>().DoSomethingAwesome();
    }
}

2. GetComponent 함수에 관하여

GetComponent(문자열) 사용 방지
GetComponent() 를 사용하는 경우 몇 가지 오버로드가 있습니다. 항상 형식 기반 구현을 사용하고, 문자열 기반 검색 오버로드를 사용하지 않는 것이 중요합니다. 장면에서 문자열로 검색하는 경우 Type을 기준으로 검색하는 것보다 훨씬 더 비쌉니다.
(좋음) GetComponent(Type 형식) 구성 요소
(좋음) T GetComponent()
(나쁨) 구성 요소 GetComponent(문자열)>

  • GetComponent 함수 중 문자열을 사용하는 방식을 지양하라는 의미이다. 템플릿등을 사용하라는 것이 권장된다. (박싱/언박싱 연산 절약)

    권장되는 예시)

    var playerInput = GetComponent<PlayerInput>();

    이와 관련하여, 다음 사항 또한 참조한다.

3. 일반 Unity API

일부 Unity API는 유용하지만 실행 비용이 많이 들 수 있습니다. 이러한 API 중 대부분은 전체 장면 그래프 에서 일치하는 몇 가지 GameObjects 목록을 찾습니다. 일반적으로 런타임에 참조를 추적하기 위해 참조를 캐싱하거나 GameObjects에 대한 관리자 구성 요소를 구현하여 이러한 작업을 방지할 수 있습니다.

  GameObject.SendMessage()
  GameObject.BroadcastMessage()
  UnityEngine.Object.Find()
  UnityEngine.Object.FindWithTag()
  UnityEngine.Object.FindObjectOfType()
  UnityEngine.Object.FindObjectsOfType()
  UnityEngine.Object.FindGameObjectsWithTag()
  UnityEngine.Object.FindGameObjectsWithTag()

편한 함수들이지만 현재 Scene에 존재하는 모든 Object들을 들추어보는 엄청난 연산을 대가로 하므로 가급적 사용하지 말 것.
하기 기재된 명령들에 대한 설명을 추가한다.

3-1. Find 쓰지 말 것

다음 링크를 참조하여, Find를 제거하는 방향으로 리팩토링 하자.

상기 링크에서는 script에 public한 variable을 선언하고, 이것을 Inspector를 사용해서 직접 끌어서 할당하는 것이 빠르다고 소개하고 있다.

transform 객체에도 find라는 함수가 있다고 하지만, 이는 GameObject.Find보다 조금 나을 뿐, 결국 쓰는 것을 권장하지 않는다.

3-2. SendMessage 쓰지 말 것

다음과 같은 사유로 사용하지 말 것.

  • Deprecated 된 구형 기술

관련 된 정보 추후 기재 요망

profile
FGPRJS

0개의 댓글