📌 개요


Unity로 게임을 개발하면 UI 시스템은 반드시 필요한 요소 중 하나입니다.
하지만 많은 개발자 분들이 UI 시스템을 최적화하지 않고 설계하는 경우가 많습니다.
오늘은 Unity UI의 기본 동작 원리를 이해하고, UI 설계 최적화 결과를 분석하며 살펴보도록 하겠습니다.
📌 캔버스(Canvas) 분리

캔버스는 UI 요소를 나타내는 메시를 생성하고, UI 요소가 변경되면 메시를 재생성하며, 실제로 UI가 표시되도록 GPU에 드로우 콜(Draw Call)을 발행합니다.
여기서 문제점은 하나의 UI 요소가 변경되면 캔버스에 존재하는 모든 UI 요소의 메시를 재구축한다는 점입니다.
많은 개발자가 하나의 캔버스에 수천 개의 UI 요소를 배치하는데, 이 방법은 CPU 비용을 급증시킬 수 있습니다.

솔루션 : 하나의 캔버스가 아닌, 여러 캔버스로 분할하여 UI 시스템을 설계합니다.
캔버스를 분할하여 Unity UI의 일괄 처리 문제를 해결하세요.
분할 방법을 결정하는 방법은 정적 UI 요소와 동적 UI 요소로 나눠 결정할 수 있습니다.
또한, 캔버스는 중첩할 수 있으므로 부모-자식 관계를 가지는 계층적 UI를 설계하세요.
자식 캔버스가 수정되어도 부모 캔버스에 영향을 주지 않는답니다!



캔버스 분리 전(25ms) → 분리 후(3ms)
📌 그래픽 레이캐스터 제한 및 레이캐스트 타깃 비활성화

그래픽 레이캐스터 (Graphic Raycaster) 컴포넌트는 사용자 입력을 UI 이벤트로 변환하는 컴포넌트입니다.
이 컴포넌트는 화면의 입력 지점을 기반으로 캔버스 내 모든 UI 요소의 Rect Transform을 체크하기 때문에 오버헤드가 존재합니다.
그래서 입력을 필요로 하지 않는 Image 또는 Text UI 요소만 존재하는 캔버스라면 그래픽 레이캐스터 컴포넌트를 제거합니다.

만약 입력을 필요로 하는 Button 또는 Slider UI 요소가 존재하여 그래픽 레이캐스터를 추가했다고 가정하겠습니다.
하지만 이 캔버스 내부에는 입력을 필요로 하지 않는 Image 또는 Text UI 요소가 존재할 수 있습니다.
이런 경우에는 입력을 받지 않도록 UI 요소 내부 프로퍼티인 'Raycast Target'을 비활성화합니다.
📌 UI Pooling 기법 활용

많은 개발자가 UI을 배치하기 위해 주로 UI Prefab을 생성하고 파괴하는 로직을 사용하는데, 이 방법은 큰 오버헤드를 발생시킬 수 있습니다.

그래서 UI(Object) Pooling 기법을 활용하여 오버헤드를 줄이는 방법을 사용합니다.
초기에는 풀이 빈 상태이기에 생성(Instantiate) 오버헤드가 발생할 수 있습니다.
하지만 삭제(Destroy)할 때는 오브젝트를 삭제하지 않고 비활성화 후 풀에 넣습니다.
그 후 오브젝트가 필요할 때 생성하는 방식이 아닌, 풀에서 오브젝트를 꺼내 활성화하여 재활용합니다.
※ 이 부분은 직접 코드를 구현해줘야 합니다.
[ UI Pooling 동작 방식 ]




📝 정리
UI 시스템 설계 최적화 방법
- 캔버스 분리 (정적 캔버스 & 동적 캔버스)
- 사용자 입력 필요 유무에 따라 그래픽 레이캐스터 제한 및 레이캐스트 타깃 비활성화
- UI Pooling 기법을 활용
이를 통해 CPU와 GPU 부하를 최소화하고 성능을 개선할 수 있습니다.
'유니티(Unity) > 최적화 기법' 카테고리의 다른 글
[Unity 최적화] UI SetActive 호출 타이밍 (0) | 2024.12.18 |
---|---|
[Unity 최적화] 오디오(사운드) 최적화 (0) | 2024.12.16 |
[Unity 최적화] UGUI 최적화 (0) | 2024.12.12 |