본문으로 건너뛰기
CHOI HONGSU
1 min read

UI 최적화 가이드

UI Canvas Rebuild Optimization Guide UI 캔버스 리빌드 최적화 가이드

이 작업에서는 모든 UI를 무작정 분리하지 않고, Static HUD / Dynamic HUD / 고정 조작 UI / 생산 UI / 스킬 UI처럼 변경 주기가 다른 영역을 기준으로 Canvas 분리 기준을 정리했습니다.

Problem

기존 구조에서는 Static UI와 Dynamic UI가 하나의 Canvas에서 함께 운영되고 있었습니다.

이 경우 체력, 생산 상태, 스킬 쿨타임, 미니맵, 버튼 상태처럼 자주 바뀌는 UI가 갱신될 때, 같은 Canvas에 포함된 고정 UI까지 Rebuild 범위에 포함될 수 있습니다.

특히 RectTransform 수가 약 12,979개까지 증가한 상태였기 때문에, 작은 UI 변경이 큰 Canvas Rebuild 비용으로 이어질 가능성이 있었습니다.

Goal

UI 변경 시 전체 Canvas가 불필요하게 Rebuild되는 구조를 줄이는 것을 목표로 했습니다.

  • Static UI와 Dynamic UI의 Canvas 분리
  • 변경 빈도에 따른 UI 그룹화
  • 풀링 / 활성화 빈도가 높은 UI의 별도 관리
  • 조이스틱, 생산, 스킬, 유닛 UI처럼 업데이트 성격이 다른 영역 분리
  • Canvas 분리로 인한 Draw Call 증가를 고려한 최소 분리 기준 정리

Implementation

  1. 01

    Static UI Hud

    먼저 화면에서 고정적으로 유지되는 HUD 요소를 Static UI로 분류했습니다.

    Static UI는 배치가 거의 변하지 않고, 값 갱신이나 활성화 변경이 적은 영역입니다.
    이 영역은 Dynamic UI와 같은 Canvas에 묶이지 않도록 분리해, 자주 바뀌는 UI의 갱신으로 인해 함께 Rebuild되는 상황을 줄이는 방향으로 정리했습니다.

    대표적으로 고정 배경, 프레임, 장식성 HUD 요소처럼 화면에 유지되지만 자주 변경되지 않는 UI가 여기에 해당합니다.

  2. 02

    Dynamic UI Hud

    체력, 자원, 알림, 상태 표시처럼 값이 자주 바뀌는 UI는 Dynamic UI로 분류했습니다.

    Dynamic UI는 텍스트, 게이지, 아이콘 상태, 활성화 여부가 자주 바뀌기 때문에 Static UI와 같은 Canvas에 있으면 Rebuild 범위가 커질 수 있습니다.

    따라서 변경이 잦은 UI는 별도 Canvas로 분리하고, 같은 Dynamic UI 안에서도 갱신 주기와 화면 위치가 유사한 요소끼리 묶는 기준을 정리했습니다.

  3. 03

    Static UI Dynamic UI

    조이스틱처럼 화면 위치는 고정되어 있지만 입력 상태에 따라 내부 요소가 움직이는 UI는 Static UI와 Dynamic UI의 성격을 함께 가집니다.

    배경이나 프레임처럼 변하지 않는 요소는 Static 영역에 가깝게 유지하고, 입력에 따라 이동하거나 갱신되는 핸들 / 방향 표시 요소는 Dynamic 영역으로 분리하는 방향을 검토했습니다.

    이렇게 하면 조작 UI 전체가 매번 큰 범위로 Rebuild되는 것을 줄이고, 실제로 변경되는 요소만 갱신 대상으로 제한할 수 있습니다.

  4. 04

    유닛

    유닛 관련 UI는 선택 상태, 체력, 생산 상태, 타겟 표시처럼 게임 상태에 따라 자주 바뀌는 요소가 많습니다.

    이 영역은 풀링과 함께 관리해야 하기 때문에, 단순히 Canvas를 나누는 것뿐 아니라 생성 / 비활성화 / 재사용 흐름까지 함께 고려했습니다.

    유닛 UI는 Static HUD와 분리하고, 전투 상황에서 갱신되는 요소끼리 묶어 별도 Canvas 또는 풀링 그룹으로 관리하는 방향을 정리했습니다.

  5. 05

    생산

    생산 UI는 큐 상태, 진행률, 버튼 활성화, 비용 표시처럼 값 갱신이 자주 발생할 수 있는 영역입니다.

    이런 UI가 Main HUD와 같은 Canvas에 포함되면, 생산 상태 변경이 전체 HUD Rebuild로 이어질 수 있습니다.

    생산 UI는 변경 빈도가 높은 Dynamic UI로 분류하고, 업데이트 타이밍 별도 Canvas 구성을 검토했습니다.

Conclusion

UI를 단순히 화면 단위로 묶지 않고, 변경 빈도와 상호작용 기준으로 분리하는 구조를 정리했습니다.

  • Static UI와 Dynamic UI 분리 기준 수립
  • 자주 갱신되는 HUD 요소를 별도 Canvas 후보로 분류
  • 조이스틱 / 유닛 / 생산 / 미니맵 / 스킬창처럼 갱신 성격이 다른 UI를 그룹화
  • Canvas 분리로 인한 Draw Call 증가를 고려해, 무분별한 분리가 아니라 변경 빈도 기준 분리로 정리

이 작업은 UI를 단순히 많이 나누는 것이 아니라, Rebuild 비용과 Draw Call 증가 사이의 균형을 잡기 위한 구조 분석입니다.

Tradeoffs & Future Work

Tradeoffs

  • Canvas가 늘어나면 Batch가 분리되고 Draw Call이 증가할 수 있기 때문에, 모든 UI를 무조건 개별 Canvas로 나누는 방식은 적합하지 않습니다.
  • 이 작업에서는 화면 위치가 아니라 변경 빈도, 상호작용 여부, 풀링 여부, 업데이트 타이밍을 기준으로 분리했습니다.