Unity는 기본적으로 Canvas단위로 Batch 처리하기 때문에 Canvas의 child element 중 단 1개라도 dirty처리가 된다면 Canvas의 모든 Element가 다시 연산되어야 한다
Canvas는 Child Element의 일종의 Vertex Buffer
단, Canvas를 너무 많이 분리하는 것도 좋지는 않음
Canvas를 분리하는 것도 필요
Screen space와 World space는 연산이 비쌈
Layout Component는 동적으로 크기가 변경되는 순간 Dirty처리
Rect Transform을 변경하지 않는다면 문제없음
Layout Group의 내부에서는 GetCompnent, Linq를 사용하는데 둘 다 비싼 연산
또는 하위 Element를 결합(Button의 외곽과 Background를 1개로 통합)하는 것을 추천
단, 이 경우 생산성 하락 위험
Pool 사용시 Disable-ReParent, ReParent-Data Update-Enable순으로 처리하라
ReParent도 Hierachy구조에 Rebuild를 수행하므로 생각보다 비싼 연산
Enable한 상태에서 ReParent를 수행할 경우 ReParent, Disable 총 2번의 Rebuild를 수행하지만 Disable한 후 ReParent를 수행한다면 Disable때만 Rebuild 수행
ReParent 자체가 비용이 들긴 하지만 ReParent 이후의 연산이 더 빨라질 수는 있음
참고로 Alpha가 0이어도 Draw call은 호출된다
Enable, Disable 시 호출되는 Callback등의 비용 감소 가능
Animator는 Keyframe방식으로 시각적 차이가 없어도 내부적으로는 Dirty처리
지속적인 UI Animation은 몰라도 일시적으로 하는 Animation이라면 Tweening처리하는 것을 추천
Render를 Disable 하게 설정하던가 Camera를 아예 먼곳으로 이동
FPS를 낮춰서 연산량을 줄여라
Unity는 Canvas, Material-Sprite Asset, Z Depth, Mask마다 Draw call 수행
즉, Texture가 분리되어 있으면 Texture마다 Draw call 수행
Atlas를 이용해서 Texture를 1장으로 병합하여 Draw call 최소화
TextMeshPro는 글자를 미리 Texture로 제작->한글의 경우 Memory Issue 발생 가능성 존재
-> Hardware의 Bandwidth를 넘어서는 Atlas size일 경우 더 느려질수도 있음
또는 Bandwidth를 감안해서 Multi Atlas를 사용했더니 이로인해 더 느려질수도 있음
-> Static Atlas, Dynamic Atlas로 분리해서 NPC같은경우 Static, Chating같은 경우 Dynamic으로 지원도 가능
Scene에 활성화된 Sprite가 동일한 Atlas안에 있는것을 추천
꼭 움직여야 한다면 동작 시작 시 Pixel Perfect를 껏다 키는 방식을 쓰던가 Nested Canvas를 이용해서 최대한 분리
픽토그램
Image->Text->Image일 경우 Image들이 같은 조건이더라도 Batch break
Draw call과 Overdraw를 최소화하는 것이 중요
UI도 결국 Mesh의 일종으로 Vertex를 갖는데, UI가 갱신되어야 할 때마다 Mesh정보를 CPU에서 매번 다시 계산해야 한다 -> CPU 병목을 크게 일으킨다
UI가 생각보다 비싼 연산량을 요구한다
https://unity.com/how-to/unity-ui-optimization-tips
https://wonjuri.tistory.com/entry/Unity-UI%EB%A5%BC-%EC%9C%84%ED%95%9C-UGUI-%EC%B5%9C%EC%A0%81%ED%99%94-%EB%B0%A9%EC%95%88
https://www.youtube.com/watch?v=1e2mSCS7o1A