유니티에서 UI요소를 화면에 배치하고 구성하는 것이 일반적이지만, 결국 프로젝트가 진행되면 될수록 UI요소는 많아지고 복잡해질 수 밖에 없다.
그래서 UI 최적화에 대해서는 한번쯤은 정리해보자 해서 포스팅하게 됐다.
유니티에 보면 윈도우 -> analysis -> FrameDebugger나 Game창의 Stats에서 Batches 와 Setpass calls 수치를 통해 UI가 최적화가 잘 되는지 아닌지를 잘 파악할 수 있다.
FrameDebugger에서는 실행 후 enable을 해보면 얼마나 드로우 콜이 일어나는지 알 수 있다. 드로우콜은 CPU에서 GPU에게 그림을 그려달라고 하는 것을 말하며 이를 줄이는 것이 최적화에 도움이 된다.
마찬가지로 Batches는 드로우콜이나 쉐이더등을 그리는 것을 합친것을 말하며 랜더링 해야하는 항목이 늘어날수록 추가되고, SetPass calls 는 같은 이미지라도 메터리얼이 달라질 경우 늘어나는 것이며 둘 다 수치가 적을수록 성능이 좋아진다.
UI 최적화 대표 예제
아래에서 언급한 것들을 잘 지키면서 하는것이 UI최적화에 도움이 된다고 볼 수 있다.
- Canvas는 사용 항목에 맞게 잘 나눠야 한다. 기능 별로 분리하여 사용하는 것이 좋다.
- 물리 계산이 필요없는 컴포넌트의 Graphic Raycast 항목은 비활성화 하는 것이 좋다.
- Camera.Main사용은 지양하는것이 좋으며 되도록이면 캐싱하거나 SceneSpace-Overlay 사용을 권장한다.
- Layout Group Component 사용도 최소화 하면 좋다.
- UI도 오브젝트 풀링을 활용하는것이 좋다.
- Canvas를 비활성화 할 경우 GameObject를 비활성화 하는 것 보다 컴포넌트를 비활성화 하는 것이 최적화가 더 조핟.
- Animator 컴포넌트 사용시 항상 변화하는 동적 요소에만 사용하는 것이 좋다.
- Mask 사용 시 Shader로 대체하는 것이 좋다. 이는 Mask 컴포넌트가 SetPass calls를 상당히 소모하기 때문이다.
- SpriteAtlas를 통해 이미지를 한데 묶어서 같이 랜더링 해주는 것이 좋다. 다만 1024 X 1024 위로부터는 용량이 꽤나 커지기 때문에 같이 쓰이는 것 끼리 잘 묶어주는것도 패킹 전략이라고 할 수 있다.
- Text사용 시 TextMeshPro 사용하기
- Canvas내에서 Instantiate 사용을 최소화 하고 오브젝트 풀링 활용하기
'Unity' 카테고리의 다른 글
퀘스트 로드에서 사용했던 FirstOrDefalut 함수 (0) | 2024.02.27 |
---|---|
CoolTimeManager 만들기 (0) | 2024.02.14 |
유니티 EditorWindow로 개발자 툴 만들기 (0) | 2024.02.01 |
플레이어 아이템 상호작용 (1) | 2024.01.30 |
Onclick.AddListener 사용시 주의점 (0) | 2024.01.25 |