프로그래밍 & 코드 아키텍쳐
Fixed Timestep
project settings > Time > Fixed Timestep이 있다. 이는 물리적 연산주기를 의미한다. Update()는 매 프레임마다 호출되며 FixedUpdate는 물리적 연산 주기마다 호출된다. 이는 targetFrameRate를 맞추는 것이 좋다. 만약 timestep이 0.02 이라면 1초에 50번 돌아간다. 이걸 잘 맞추는 것을 간과하면 안된다. 이러한 targetFrameRate는 장르 별, 상황 별로 조절해야 한다. 예로 들어, 퍼즐 게임 같은 경우는 연산 주기가 빠를 필요가 없을 것이다.
Adaptive Performance(Youtube 검색)
가변적으로 performance를 실시간으로 적절하게 변경 가능
비동기 로딩 사용
AssetBundle.LoadFromFileAsync()
AssetBundle.LoadAssetAsync()
사용하지 않는 MonoBehaviours 제거
안에 아무것도 없는 함수라면 지워주는 것이 좋다. Start(), Update(), FixedUpdate() 등등 MonoBehaviours 함수는 비어있어도 Unity는 호출하게 된다. Unity Engine은 C++에서 C#을 오버헤드 하는 구조이다. C#(usercode)에서 object들에 함수들이 있다. 그면 C++(Unity Engine)에 object들에도 그 함수들이 있다. Unity Engine에는 Update를 가지고 있는 애들의 목록, Start를 가지고 있는 목록들을 따로 가지고 있으며 Update를 한 번 실행할 때마다 그 오브젝트들을 호출해서 실행하게 된다. 따라서 빈 함수가 들어가있으면 쓸데없이 함수를 호출하게 된다.
또한 1000개의 오브젝트에 Update()문이 돌아가는 것보다 하나의 매니저에서 한 번의 Update로 함수들을 실행하는 것이 효율 측면에서 좋다.
비싼 API의 빈번한 호출 주의
GameObject.Find(), GameObject.GetComponent()와 같은 API들은 Update문과 같이 반복적으로 사용되는 함수에서는 되도록 안쓰도록 하는 것이 좋다.
Debug.Log() 주의
[Conditional("ENABLE_LOGS")].
Debug.print와 같은 함수를 그대로 둔체 빌드하게 되면 이 역시 플레이 와중에 실행된다. 개발 과정에서 Debug를 사용했다면 지워주거나 위처럼 헤더를 사용하는 것이 좋다.
allocating API 주의
Component.GetComponents(), Animator.parameters, ...
정적 데이터 파싱 주의
XML/JSON -> 스크립터블 오브젝트
https://www.youtube.com/watch?v=lx5x41WqgMo
'Unity' 카테고리의 다른 글
[Unity] 사운드, OGG와 MP3 차이 (0) | 2023.05.26 |
---|---|
[Unity] CinemachineBrain Custom Blends (0) | 2022.12.07 |
[Unity] Unity 최적화 공부(3) (0) | 2021.05.13 |
[Unity] Unity 최적화 공부(2) (0) | 2021.05.12 |
[Unity] Unity 최적화 공부(1) (0) | 2021.05.12 |