본문 바로가기
개발 (Game)/Unity

[Unity] UGUI 성능 최적화

by 진현개발일기 2024. 9. 17.

[영상]

https://www.youtube.com/watch?v=1e2mSCS7o1A&lc=UgwtRZ7Kxx1CZQRd9lV4AaABAg

 

[공부를 위해 정리한 것 기록]

1. 캔버스 하나에 여러 UI를 한 번에 묶는 것보다, 자식 캔버스(Nested Canvas)를 두는 것을 권장. 이유는, 부모 Canvas에 수정 사항이 발생하지 않는 이상, 자식 Canvas의 UI가 Dirty 될 때 해당 Canvas만 갱신시킨다. 만약 한 캔버스 안에 모두 담아둔다면 자식 중 하나만 변경되어도 모든 자식들을 갱신하는 비용이 있다. 


그렇다고 모든 자식들이 캔버스를 갖고있는 것은 비추천. 무거울수 있기 때문. UI 최적화는 케바케가 심하므로 완벽한 정답이 없으니 상황에 맞게 사용하길 권장 (etc: 동적인 객체, 정적인 객체 나눠서 등)


2. UI 풀링할때 reparenting 하는 경우가 있는데 저렴한 비용이 아니다. 그 이유는 RectTransform이 계층 구조를 가진 Transform을 상속받고있고, 부모가 바뀌게 되면 본인 포함 자식 개체들을 갱신시켜준다. 

(OnBeforeTransformParentChanged, OnTransformParentChanged, OnTransformChildrenChanged)

3. 3D 같은 경우 Frame Debugger에서 충분히 Batching이 깨진 이유를 설명해주나, UI는 그 원인을 설명을 안해줌. 그러므로 UI는 프로파일러 내에 UI 항목을 확인하는 것이 편함. 어떤 UI를 그려주는 Batching인지 확인할뿐더러 배칭이 깨진 이유를 설명해줌 (ex. Use Different Texture)

4. 블렌딩이 들어가는 쉐이더는, 불투명 X 반투명O, Z값에 따라 나눠 그리기 때문에 (Back-To-Front) Z값을 나누게 될 경우 배칭이 깨지게 된다. 이는 UI에도 적용이 되므로 Z값을 나눠 작업하게되면 배칭이 깨지게 된다.

(번외) 스프라이트 같은 경우 알파값이 0이어도 Active 상태면 렌더링, 더티 대상이다.

5. UI 스프라이트의, 특히 동적인 애들, Pixel Perfect는 성능에 많은 악영향을 끼친다. RectTransform 변경 시 모든 정점을 재계산하기 때문이다.

6. 그럼에도 Pixel Perfect를 놓치고 싶지 얂으면, 따로 스크롤링 할 때만 꺼주는 기능을 넣거나 그 외 별도 작업 (ex. Nested Canvas들 중 픽셀퍼펙트가 필요없는 것들은 Off로 설정) 을 해줘야 한다.

7. Layout 정렬 관련 컴포넌트 (Layout Group, Grid, 등등)은 초기 세팅 시 혹은 요소의 특성(행렬이 적용되는 T•R•S 등) 변경 시에만 Enable해주고 필요없을 땐 Disable을 해주는 것이 좋다.

8. 버튼 같은 경우 여러 가지의 상태 혹은 테두리를 나타내기 위해 각각의 오브젝트를 두지 말고 성능을 위해, 추가작업이 필요하지만, 하나의 버튼 안에서 다 처리해줘야한다. 예를 들어 같은 크기의 Sprite만 변경해줬을 때는 Dirty가 발생하지 않기 때문에 (이건 앞에서 설명해주심) 성능 측면에서 효율적이다.

9.  UI도 스크롤 같이 같은 타입의 개체를 많이 사용해야하는 경우 오브젝트 풀링을 사용하길 권장. (Optimized, Unoptimized 비교하는 모습 보여주시고있음)

10. 버튼 움직임이라든지 화려한 연출을 위해 보통 애니메이터를 사용하는데 애니메이터는 KeyFrame 방식으로 동작하므로, Idle 상태일 때도 Dirty가 발생하니깐 항상 변경되는 UI [Idle일 때도 움직이는]에만 애니메이터를 적용하는 것을 권장한다. 대신에 코드로 된 외부 플러그인 (DoTween)을 사용하거나 직접 코드를 작성해서 애니메이팅 하는 것을 권장한다.

11. 불필요한 이미지의 Raycast Target을 비활성화하고 필요한 곳에서만 Raycaster를 사용

12. 화면 전체를 덮는 UI를 활성화 했으며 뒤에 3d배경이 켜져있을 필요가 없다면 해당 장면을 렌더링하는 카메라를 꺼주거나 빈 곳을 보도록 돌려버려야한다. 하지만, 카메라를 껏다켰다하면 오버헤드가 발생할 수 있으니 다른 곳을 보도록 하는 것이 더 효율적일 수 있다.

13. 전체 화면을 덮는 UI가 활성화되었을 때, UI는 60프레임까지 돌릴 필요없으니, 모바일 기준으로 배터리 및 자원을 아끼기 위해 풀스크린UI 상태에서는 타겟 프레임 레이트를 30으로 낮춘다거나 비슷한 작업을 해주길 권장.

 

728x90