Unity 내일배움캠프 TIL 1025 | Unity에서 CPU 성능 최적화

🐻 CPU 성능 추천 사항
- 캐시 참조를 사용하자
- GetComponent 및 Camera.main과 같은 반복적인 함수 호출 비용이 포인터를 저장하는 메모리 비용보다 비싸다
→ 초기화 시 관련 구성 요소 및 GameObject에 대한 참조를 캐싱하는 것이 좋음
- Camera.main은 아래의 FindGameObjectsWithTag()만 사용
→ MainCamera 태그를 사용하여 카메라 개체를 검색하므로 많은 비용이 들어감
- 비용이 많이 드는 작업을 지양하자
- LINQ
- 알고리즘을 수동으로 작성한 경우보다 더 많은 계산과 메모리 필요
- 일반 Unity API
- 유용하지만 실행 비용이 비쌈
- 예 : Find 계열 함수, SendMessage(),
BroadcastMessage()
- Boxing
- 박싱은 C# 언어 및 런타임의 핵심 개념
- 메모리 할당이 발생하며, 삭제 시 가비지 수집기에서 처리 필요
→ 할당 취소가 성능 비용을 발생시킴
→ 더 비용이 저렴한 대안으로 대체 가능
- 박싱을 방지하기 위해 숫자 자료형과 구조체를 저장하는 변수, 필드 및 속성의 형식이 object를 사용하는 대신 int, float 또는 MyStruct와 같은 특정 형식이어야 함
- 또한 개체를 List나 ArrayList에 넣을 경우, List<Object>가 아닌 List<int>와 같이 선언
- Update() 함수
- Update 함수 내에 로직이 없다면 지울 것
- 각 구성 요소에서 반복적이고 동일한 Raycast 작업을 수행하는 대신, Scene에서 Raycast를 응시하도록 처리
→ 이 결과를 다른 Scene 구성 요소에서 다시 사용하는 전용 Singleton 클래스 등을 사용하는 것이 좋음
- Start() 또는 Awake()에서 캐싱 참조를 하여 Update() 내에서 반복적으로 GetComponent() 작업을 하는 것을 방지
- 가능하다면 모든 개체를 인스턴스화하고 오브젝트 풀링을 사용하여 GameObject를 재활용하는 것이 좋음
- 인터페이스
- 인터페이스를 통한 함수 호출이나 virtual 함수를 호출하는 것이 직접 함수 호출을 활용하는 것보다 비용이 비쌈
→ 불필요한 인터페이스나 virtual 함수를 제거해야 함
- 코드의 가독성과 유지 보수성 측면에서는 사용하는 것이 좋기 때문에 성능과의 절충안이 필요함
- 값으로 구조체 전달 X
- 구조체는 값 형식이기 때문에 함수에 직접 전달할 경우, 해당 내용을 새로 만든 인스턴스에 복사하게 됨
→ CPU 비용과 스택 메모리 추가
- Update() 내에서는 함수 정의를 구조체가 아닌 참조로 전달하도록 수정
- 기타
- Physics
- Physics에 소요되는 시간 또는 초당 반복 횟수를 제한
- Collider
- 성능 순서 : Sphere < Capsule < Box <<< Mesh(볼록) < Mesh(비볼록)
- 애니메이션
- Animator 구성 요소를 사용하지 않도록 설정
끗~!