Text
Rich Text는 필요하지 않다면 체크 해제 합니다.
Best Fit은 필요없다면 사용하지 않습니다
- FontSize별로 폰트 이미지 아틀라스를 생성합니다. 성능이 저하되고 메모리 단편화가 발생합니다. (메모리 사용량 증가와 빈번한 풀 GC 수행)
Best Fit이 아닐경우 Hozizontal Overflow를 Wrap대신 Overflow 사용을 고려해보세요.
- RectTransform의 Width나 Height가 작다면 글자가 잘려보일 수 있습니다.
Image
Sprite를 None으로 두지마세요.
- None으로 비워두면 drawcall이 올라갑니다. None대신 주변 Image와 동일한 Atlas이미지를 넣어주세요.
Raycast Target은 필요하지 않다면 체크 해제 합니다.
- Text와 같은 이유입니다.
- 반대로 Button의 Target Graphic으로 지정된다면 Raycast Target이 체크되어야 합니다.
Button
이미지를 반전시킬땐 Transform의 Roataion Y를 180으로 하는 대신 Scale x를 -1로 해주세요
- Rotation으로 반전시키면 터치 이벤트가 발생하지 않습니다.
- 드로우 콜 배칭 - Unity 매뉴얼
“트랜스폼에 미러링이 포함된 게임 오브젝트는 배칭되지 않습니다. 예를 들어 스케일이 +1인 게임 오브젝트 A와 스케일이 –1인 게임 오브젝트 B를 함께 배칭할 수 없습니다.”
라고 나와있지만 실제 테스트결과 배칭이 잘 되었습니다.
Canvas
Render Mode의 Overlay는 Camera보다 약간 더 빠릅니다.
- 카메라 공간이 거쳐야하는 모든 컬링 및 정렬을 피하기 때문입니다.
- 하지만 Overlay는 Camera보다 항상 상위 뎁스로 보이기 때문에 사용에 참고하세요.
Render Mode를 Screen Space - Camera로 설정했다면 Render Camera를 None으로 두지 않습니다
- 비어있다면 기본 카메라를 사용하려고 Camera.main을 호출하게 되고, 이는 Object.FindObjectWithTag를 호출하기 때문에 성능저하를 일으킵니다
- 2020.2 버전부터 성능개선이 되었습니다
Unity 2020.2의 새로운 성능 개선 사항 | Unity Blog
Pixel Perfect는 필요하지 않다면 체크 해제 합니다.
- 성능 저하가 일어납니다.
Canvas 하위에서 인터렉션이 필요없다면 Graphic Raycaster는 비활성화합니다.
- Text/Image의 Raycast Target을 체크해제 하는것과 같은 이유입니다.
Canvas를 상태별로 분리합니다
- Text 값 변경, Transform 변환, 색상, Active 변경 등등이 발생하면 Canvas에 dirty 플래그가 발생하고 Canvas는 해당 프레임에 모든 자식요소들을 검사하여 배칭하고 GPU에 전달합니다 (리빌드 발생)
- 그렇기 때문에 3개의 Canvas로 분리합니다.
- 자주 움직이는 Canvas
- 간헐적으로 움직이는 Canvas
- 전혀 움직이지 않는 Canvas
- 아래와 같이 Canvas 하위에 Canvas를 둬서 분리할 수도 있습니다. 이렇게 되면 화면이 움직이는 스크롤의 캔버스만 GPU에 전달되고, 스크롤 캔버스 밖은 GPU에 전달되지 않아 효율적입니다.
- 분리 전 약 25ms → 분리 후 약 3ms
Layout Group
Layout Group 컴포넌트들은 가능한한 사용하지 않아야 합니다
- 레이아웃 그룹내의 각 child 요소(Image, Text 등등의 Layout Element)가 1개라도 변경되면 레이아웃 그룹의 모든 요소가 GetComponents를 한번 이상 수행하기 때문입니다.
- 높은 퍼포먼스가 필요한 화면에선 해당 기능대신 필요에 따른 코딩을 작성하는것을 권장하고, 퍼포먼스 이슈가 없는 화면에서만 사용합니다.
UI작업시 배치를 위해 사용하고, 작업완료 후 Layout Group 컴포넌트를 제거합니다.