원문 : Other UI Optimization Techniques And Tips

주의 : 번역이 개판이므로 이상하면 원문을 참조하십시오.

주의 : 허락받고 번역한 것이 아니므로 언제든지 내려갈 수 있습니다.



Other UI Optimization Techniques And Tips


확인 완료한 버전: 5.3 - 난이도: 고급


종종 UI 를 최적화할 명백한 방법이 없을 때도 있습니다. 이 섹션은 UI 성능을 개선하는데 도움을 줄 수도 있지만 구조적으로 "명백"하지는 않은, 유지보수하기는 어려울 수도 있거나 이상한 사이드 이펙트를 가질 수도 있는 몇 가지 제안을 하고자 합니다. 다른 것들은 초기 개발을 단순화하기 위한 UI 에서의 동작들을 위한 우회책들인데, 이는 상대적으로 성능 문제를 쉽게 발생시킬 수 있도록 해 줍니다.


RectTransform-Based Layouts


Layout 컴포넌트는 상대적으로 비쌉니다. 왜냐하면 그것들은 그것이 갱신될 때마다 자식 요소들의 크기와 위치를 재계산해야만 하기 때문입니다( 세부 사항을 원하면 Fundamentals 챕터의 Graphic rebuild 섹션을 참고하십시오 ). 만약 주어진 Layout 에 상대적으로 적고 고정된 개수의 요소들이 존재한다면, Layout 은 상대적으로 단순한 구조를 가지며, RectTransform 기반 레이아웃으로 대체하는 것이 가능할 것입니다.


RectTransform 에 대한 앵커를 할당함으로써, RectTrasnform 의 위치와 크기는 그것의 부모에 기반해 스케일링되도록 만들어질 수 있습니다. 예를 들어 단순한 두 개의 컬럼으로 구성된 레이아웃은 두 개의 RectTransform 들로 만들어질 수 있습니다:


    • 왼쪽 컬럼의 앵커는 X:(0, 0.5), Y(0,1) 이어야 합니다.
    • 오른쪽 컬럼의 앵커는 X(0.5,1), Y(0,1) 이어야 합니다.


RectTransform 의 크기와 위치에 대한 계산은 Transform 시스템 자체에 의해 네이티브 코드에서 수행될 것입니다. 이는 일반적으로 Layout 시스템에 의존하는 것 보다 더 좋은 성능을 냅니다. 또한 RectTransform 기반 레이아웃을 설정한 MonoBehaviour 를 작성하는 것도 가능합니다. 그러나 이는 상대적으로 복잡한 작업이며, 이 가이드가 다루는 영역에서 벗어납니다.


Disabling Canvas Renderers


UI 의 서로 다른 부분을 보여주거나 가릴 때, 보통 UI 의 루트에 있는 게임오브젝트를 enable 시키거나 disable 시킵니다. 이는 disable 된 UI 내의 컴포넌트가 input 이나 유니티 콜백을 받지 않도록 만듭니다.


그러나, 이는 Canvas 로 하여금 자신의 VBO 데이터를 버리도록 만듭니다. Canvas 를 다시 enabling 하는 것은 Canvas( 및 그것의 모든 Sub-Canvas ) 로 하여금 리빌드 절차와 리배칭 절차를 실행하도록 만듭니다. 만약 이러한 일이 자주 발생한다면, 증가된 CPU 사용량이 애플리에이션의 프레임 율을 뚝 떨어뜨릴 수 있습니다.


가능하다면, 이상하기는 하지만, UI 를 자신의 Canvas 나 Sub-canvas 상에 shown/hidden 되도록 배치하고 Canvas 나 Sub-canvas 에 붙어 있는 CanvasRenderer 컴포넌트를 enable/disable 시키는 것은 거의 하지 않는 우회책이 있습니다.


이는 UI 의 메쉬들이 그려지지 않도록 만들지만, 그것들은 메모리 상에 남아 있게 되며 원래의 배칭이 보존됩니다. 더우기 OnEnable 이나 OnDisable 콜백이 UI 계층상에서 호출되지 않을 것입니다.


그러나 이는 UI 의 Graphic 들을 GraphicRegistry 에서 제거하지 않으므로 그것들은 여전히 Graphic Raycast 를 검사하기 위해 컴포넌트의 리스트 상에 제출될 거라는 것에 주의하십시오. 이는 감춰진 UI 내의 어떠한 MonoBehaviour 들도 disable 시키지 않을 것이며, 이러한 MonoBehaviour 들은 여전히 Update 와 같은 유니티 생명주기 콜백들을 받을 것입니다.


이 문제를 피하기 위해서는, 이러한 방식으로 disable 될 UI 상의 MonoBehaviour 들이 유니티 생명주기 콜백들을 직접적으로 구현하지 않지만 UI 의 루트 게임오브젝트 상의 "Callback Manager" MonoBehaviour 로부터 자신들의 콜백을 받도록 해야 합니다. 이 "Callback Manager" 는 UI 가 shown/hidden 될 때마다 통지를 받아서 생명주기 이벤트들이 필요에 따라 전파되거나 전파되지 않도록 보장할 수 있습니다. 이 "Callback Manager" 패턴에 대한 더 많은 설명은 이 가이드의 영역을 벗어납니다.


Assigning Event Cameras


만약 가 월드 공간 카메라 모드나 스크린 공간 카메라 모드로 렌더링하도록 설정되어 있는 Canvas 들과 함께 유니티의 내장 Input Manager 를 사용하고 있다면, 항상 각각에 대해 Event Camera 나 Renderer Camera 속성을 설정하는 것이 중요합니다. 스크립트에서, 이는 항상 worldCamera 속성으로 노출됩니다.


만약 이 속성이 설정되지 않는다면, 유니티 UI 는 Main Camera 태그를 가진 게임 오브젝트에 붙어 있는 Camera 컴포넌트들을 검색함으로써 메인 카메라를 검색할 것입니다. 이 검색은 월드 공간 캔버스나 로컬 공간 캔버스당 적어도 한 번은 발생할 것입니다. GameObject.FindWithTag 는 느린 것으로 알려져 있기 때문에, 모든 월드 공간 캔버스와 카메라 공간 캔버스들은 디자인시나 초기화시에 할당된 Camera 속성들을 가질 것을 강력히 권합니다.


이 문제는 Overlay 캔바스에서는 발생하지 않습니다.

+ Recent posts