본문 바로가기
카테고리 없음

[TRW] UI 처음 생성시 시간 딜레이에 대한 해결책

by mazayong 2024. 7. 25.

UI를 처음 생성할 때 발생하는 시간 딜레이를 줄이기 위한 방법을 적어놓았다.

 

 

0. 이전에 사용했던 방법

 

 

 

0. 이전에 사용했던 방법

= 처음에는 UI 프리팹을 미리 UIManager에서 선언 후 활성화하는 방법을 차용했다. 그러나 사실상 이전에 미리 로드해두는 것이어서 메모리 사용량에 있어서는 동일하다는 생각이 들어 다른 방법을 고민해보게 되었다.

 

그러므로 고민했던 방법들에 대한 간단한 정리 및 나의 생각을 적어보았다.

* Preloading

= 씬이 시작될 때 필요한 모든 UI 미리 생성 및 비활성화 상태로 구성하는 것으로, UI가 필요할 때 활성화하면 된다.

 

* Addressable 및 Async Loading 

= Unity 자체 시스템 또는 직접 구현한 비동기 방식을 사용해 메인 스레드 작업을 최소화해 프레임 드랍을 줄일 수 있다.

 

* Object Pooling

= 미리 정해진 개수의 UI 오브젝트를 생성하고 필요할 때 재사용하는 방법이다.

 


* 그 외

= UI를 처음 생성할 때 필요한 리소스만 로드하고, 나머지는 필요할 때 로드하는 방식이다.

 

 

해당 방법에 대해 내용을 고민해본 결과, 유니티 자체에서 제공하는 Object Pool은 오브젝트의 개수가 많을 때 효용이 있지만 내가 고민하는 UI는 한 번 생성하고 활성화와 비활성화를 반복하기 때문에 사실상 Preloading과 다를 게 없어보였다. 그리고 그 외 UI를 처음 생성할 때 필요한 리소스만 로드하고, 나머지는 필요할 때 로드하는 방식도 효율적일 수 있지만 필요한 연산량 스케일이 그렇게 크지 않고 메모리 사용량이나 로드 시간은 동일한 것 같아서 Preloading과 Async Loading중에 고민하게 되었다.

 

 

전반적으로 비동기 로딩(Async Loading)과 프리로딩(PreLoading)의 특징을 정리하면 아래와 같다.

* 비동기 로딩

= 메모리 효율성 증가(필요한 시점에만 리소스를 로드하기 때문.)

= 초기 로드 시간 단축(게임 시작 지점에서의 로딩 시간 감소)

= 유연성(UI 요소 동적 추가 및 변경 용이)

= 코드의 복잡성 증가

= 잠재적 딜레이(UI 처음 로드시 딜레이 발생)

= 에러 처리 필요(로딩 실패할 때의 경우의 수 작성해야 함)

 

 

* 프리로딩

= 즉각적 반응(이미 메모리에 로드된 상태이므로 UI 딜레이가 적다.)

= 단순성(구현이 간단하고, 로딩 실패에 대한 문제가 발생하지 않음)

= 일관성(게임 플레이 중 일관된 성능 유지 가능)

= 메모리 사용량 증가(사용하지 않는 UI가 메모리에 상주하기 때문)

= 초기 로드 시간 증가(게임 시작시 모든 UI 로드해야 하기 때문)

 

전반적으로 중요한 부분은 메모리 이슈, 초기 로드 시간, UI 복잡성, 개발 편의성인 것 같아서 해당 부분에 대해 정리하면 아래와 같다.

메모리 제약 : 메모리가 중요한 모바일/저사양 기기에서는 비동기 로딩.

초기 로드 시간 : 빠른 시작이 중요한 경우 비동기 로딩.

UI 복잡성 : 많은 UI 요소가 자주 사용되면 프리로딩.

개발 편의성 : 단순하고 안정적인 구조는 프리로딩.

 

전반적으로 장단점이 존재하는 것 같은데, 전부 통일하기보다는 자주 사용되는 UI는 프리로딩, 드물게 사용되는 UI는 비동기로딩 하는 방법도 좋아보인다. 

 

 

전반적으로 필요한 UI가 대화창UI, 선택창UI, 인벤토리UI, 버튼UI, 지도UI, 세팅UI, 엔딩UI 등이다.

여기서 자주 쓰이는 UI는 선택창UI, 대화창UI, 버튼UI이다.

자주 쓰이지 않는 UI는 세팅UI, 엔딩UI 확인이다.