EveryDay.DevUp

[Unity] UGUI 최적화 본문

Unity/최적화

[Unity] UGUI 최적화

EveryDay.DevUp 2020. 5. 20. 09:07

UGUI : Unity에서 제공하는 Built-in UI 시스템

▶ Unity 초기 UI 시스템은 매우 불편하였고, Asset Store에 UI를 용이하게 사용할 수 있는 EZGUI, NGUI와 같은 UI 어셋이 있었다.

▶ Unity 4.6 버전에서 UGUI가 릴리즈 되었는데, NGUI의 개발자가 Unity에 합류하여 개발해서 그런지 많은 시스템이 NGUI와 유사하다.

▶ 현재는 NGUI도 많이 사용하지만, UGUI도 많이 사용하여 개발하는 상황으로, 엔진 단에 코어한 코드( Canvas.. )를 제외한 나머지 UI 시스템은 오픈되어 있다.

: UGUI 코드를 분석하면, UI 시스템 외에 Unity Custom Editor를 만들 때 사용할만한 코드와 Unity의 코드 스타일 같은 것도 알 수 있다.

https://bitbucket.org/Unity-Technologies/ui/src/2019.1/ 

▶ UGUI는 Unity에서 관리하기 때문에 다른 UI 시스템 보다 Unity 친화적이고 좀 더 Unity에 최적화 되어 있다. 하지만 다른 UI 시스템에 비해 UI 기능을 추가로 구현해야될 부분이 많다.

UGUI 최적화 : Unity 컨퍼런스 발표 자료를 바탕으로 UGUI를 최적화 하는 방법을 설명하고자 함

참고자료 : https://unity3d.com/kr/how-to/unity-ui-optimization-tips

참고자료 : https://www.youtube.com/watch?v=eH-PdFKgctE

1. 캔버스 분할

Canvas는 UGUI에서 가장 기본이 되는 UI 컴포넌트로, Canvas를 통해 하위의 UI 오브젝트를 그리게 된다. Canvas는 UI 요소들을 다이나믹 배칭으로 통합 Mesh를 만들어서 보여주는데, Canvas 하나에 수 많은 UI가 있다면 그 UI 요소 하나의 변경만으로도 전체 메시를 다시 생성하게 되는 부하가 생기게 된다.

▶ 이를 해결하기 위해서는 Canvas에 속해있는 UI를 유사한 속성끼리 분류하여 Sub Canvas를 만들어서 사용하는 것이다. 그렇다고 UI를 디테일하게 분리하여 Canvas를 여러개 만들면 이것 또한 부하가 생긴다.

2. 불필요한 Raycast Target 없애기

UI 컴포넌트를 붙이면, 자동으로 Raycast Target이 켜져있는데 불필요한 컴포넌트까지 충돌 검사를 하는 문제가 생긴다.

▶ 이를 해결하기 위해서는 Raycast가 불필요한 컴포넌트는 옵션을 꺼줄 필요가 있다.

3. Camera.Main 사용 제거

Canvas의 Render Mode를 World Space로 했을 때 Event Camera를 None으로 하면, 이벤트를 수신할 때 어느 카메라가 기본 카메라인지 확인하기 위해 카메라들에 대한 CompareTag가 매 프레임 발생하게 된다.

▶ 이를 해결하기 위해서는 Event Camera를 설정 해야하고, 더불어 코드내에서 Camera.Main을 사용하기 보다는 캐싱해서 사용하거나 프리팹에 할당해서 사용하는 것이 좋다.

4. 오브젝트 풀링 시 유의점

UI 오브젝트를 풀링하는 경우, 풀링할 오브젝트가 Active된 상태로 부모를 변경하는 경우 의도치 않은 Canvas의 갱신이 발생하게 된다.

▶ 이를 해결하기 위해서는 풀링할 오브젝트를 먼저 Hide시킨 후 부모를 변경하는 과정이 필요하다. 반대의 경우 ( 풀링된 오브젝트를 꺼내오는)에는 부모를 먼저 변경한 후 Active 시켜야 한다.

5. 캔버스 컴포넌트를 잠시 Hide 시키는 경우 유의점

Object 자체를 Hide 시키는 경우 다시 Active 시킬 때 Mesh를 다시 Rebuild하면서 오버헤드가 발생한다.

▶ 이를 해결하기 위해서는 Canvas 컴포넌트를 비활성화 하면 Mesh정보를 들고 있기 때문에 다시 Active 되었을 때 부하가 적다.

6. UI에서 애니매이터 사용은 자제

애니매이터는 멈춤 없이 계속 플레이 되기 때문에 UI 오브젝트가 계속 변경됨으로 인해 Canvas에 부하가 발생한다.

▶ 이를 해결하기 위해서는 Tween 을 사용하거나 1회성 애니매이션을 사용하는 것이 좋다.

7. Layout Group 지양

Layout Group을 사용하는 경우 레이아웃이 변경될 때마다 자식 오브젝트들에 대한 GetComponents가 최소 1회 수행되어 오버헤드가 발생한다.

▶ 이를 해결하기 위해서는 자체적으로 계산 코드를 만들거나, 꼭 필요한 경우에만 업데이트가 될 수 있도록 해야한다.

8. UI Batching 규칙

▶ 동일한 Canvas 공유

▶ 동일한 Material 공유

▶ 동일한 스프라이트 아틀라스 공유

▶ 동일한 Rect Transform의 z 위치 공유

9. UI Text 사용 시 Text Mesh Pro 사용

기본적으로 제공되는 UGUI의 Text 컴포넌트보다 성능이 우수한다. 

10. Canvas의 PixelPerfect 사용 시 유의점

PixelPerfect를 사용하는 Canvas 밑에 Scroll이 있을 경우, 스크롤 시에 부하가 심하다. 

▶PixelPefect를 사용하는 Canvas 대신, Sub Canvas를 만들어서 하위에 스크롤을 붙이고 PixelPerfect 옵션을 끈 후 사용해야 한다.