저는 UniText(Unity용 텍스트 엔진) 개발자입니다. 최근 몇몇 대형 스튜디오에서 저에게 같은 요청을 했습니다. 바로 빌드 크기를 줄이고 메모리 사용량을 감소시키라는 것이었습니다. 그래서 저는 그들의 빌드를 파헤쳐서 실제 용량이 어디에 쓰이는지 확인했고, 모든 프로젝트에서 UI Toolkit이 있다는 것을 발견했습니다. 심지어 전혀 사용하지 않는 프로젝트에서도 말입니다.
저는 이것이 특정 설정과 관련된 것인지 궁금해서 빈 프로젝트를 확인해 보았습니다. 거기에도 있었습니다. 그래서 얼마나 흔한 일인지 알고 싶었습니다. 저는 미국 Google Play 게임 차트(무료, 수익 창출형, 유료 등 모든 게임 카테고리)에서 상위권부터 순회하며 다운로드할 수 있는 모든 게임의 빌드를 읽어보았습니다. 388개의 게임을 확인한 후, 제가 다운로드하던 미러가 저를 차단했습니다. 이 중 254개는 Unity로 만들어졌고, 실제로 읽을 수 있었던 것은 216개였습니다. 그중 207개가 UI Toolkit을 포함하고 있었습니다(96%). Unity 2021 이상 버전의 경우 208개 중 204개였으며, 보통 게임당 수천 가지 유형이 존재합니다.
재미있는 점은 Unity 자체의 6.3 매뉴얼에서 런타임 UI에는 uGUI를 권장하며 UI Toolkit을 대안으로 나열한다는 것입니다. 그럼 이것은 어디서 오는 것일까요? uGUI 프로젝트에서는 uGUI 자체에서 옵니다. uGUI는 UI Toolkit을 참조하는 몇 가지 작은 브릿지 클래스(PanelEventHandler, PanelRaycaster)가 있으며, 이들은 UI Toolkit 모듈이 설치될 때마다 컴파일됩니다. 그리고 이것은 항상 설치되어 있는데, 왜냐하면 에디터 자체가 이 기반으로 구축되었기 때문입니다.
저는 Canvas와 Text 하나만 있는 빈 프로젝트에서 측정해 보았습니다. Android ARM64, 릴리스 IL2CPP, 기본 최소 스트리핑(Minimal stripping)을 사용했을 때, Unity 2022.3에서는 uGUI가 APK의 4.25 MiB를 차지하며, 그중 3.05 MiB가 UI Toolkit이었습니다. Unity 6.6에서는 6.30 MiB이며, 그중 3.95 MiB가 UI Toolkit이었습니다. 기기에서 압축을 풀면 코드와 메타데이터가 총 12~16 MiB에 달합니다.
저는 한 프로젝트에서 휴대폰으로 메모리도 측정해 보았는데, 이것을 제거하자 상주 메모리(resident memory)가 약 10 MiB 감소했습니다. 모두가 가장 먼저 제안하는 것은 Package Manager에서 이 모듈을 제거하는 것입니다. 제가 시도해 봤습니다. Unity는 그것을 다시 추가했고, APK 크기는 4바이트가 변했습니다.
2024년에 누군가가 Unity 포럼에 UI Toolkit을 제거할 수 있도록 해달라고 요청한 적이 있습니다.
답변은 에디터가 의존하기 때문에 이 모듈이 내장(built-in) 상태로 유지되며 "패키지로는 돌아갈 수 없다"는 것이었습니다. 이는 에디터 입장에서는 이해가 가지만, 게임 빌드 자체에는 필요하지 않습니다. 그래서 저는 이를 플레이어 빌드에서 제거하고 에디터는 그대로 두는 패키지를 만들었습니다. 이름은 LightSide Lean이며, 무료이고 MIT 라이선스입니다.
빈 uGUI 프로젝트에서 이 패키지는 2022.3 버전에서는 3.05 MiB의 APK 용량을, 6.6 버전에서는 3.95 MiB를 절약해 줍니다. 만약 플레이어 코드 중 일부가 여전히 UI Toolkit을 사용한다면, 빌드는 실패하며 조용히 유지하는 대신 정확한 줄(line)을 보여줍니다. 또한 다른 사람의 패키지를 업데이트할 때도 여러분의 수정 사항을 유지해 줄 수 있으며, UniText를 사용하면 사용하지 않는 코드를 제거(strip)할 수도 있습니다.
물론 게임이 실제로 UI Toolkit을 사용하는 경우라면 이 기능을 활성화하지 마십시오. 그리고 Unity 6.6의 고(High) 스트리핑 설정에서는 Unity가 이미 일반적인 uGUI 프로젝트에서 이를 제거하므로, LightSide Lean은 거의 아무것도 절약하지 못합니다.
본인의 게임을 확인하고 싶다면: IL2CPP 빌드를 수행한 후 Library/Bee/artifacts/<platform>/ManagedStripped 폴더를 살펴보십시오. 만약 UnityEngine.UIElementsModule.dll 파일이 있다면, 여러분의 빌드는 UI Toolkit을 포함하고 있다는 의미입니다. 이전에 실제 출시된(shipped) 게임에서 측정해 본 사람은 아무도 찾지 못해서 궁금합니다. 다른 분들도 빌드에서 이를 발견하신 적이 있습니까? 그리고 기존에 해결책을 알고 계시다면 공유해 주십시오: https://github.com/LightSideKittens/media.lightside.leanbuild
요약(TL;DR): Google Play의 상위 216개 Unity 게임 중 207개가 UI Toolkit을 포함하고 있습니다. uGUI 프로젝트에서는 uGUI가 이를 가져오는데, 이는 APK에서 uGUI가 차지하는 용량의 약 3분의 2에 해당합니다. Unity는 이것이 제거 불가능할 것이라고 말했기 때문에, 저는 이 패키지를 만들어 플레이어 빌드에서 이를 제거했습니다. /u/malvis_light 님이 제출함 [링크] [댓글]