Pull to refresh

Unity: Как засунуть около 40-ка 4к текстур в iPad 16-го года

Шапка проекта, с которого история берет свое начало, она мне нравится, поэтому она тут :3
Шапка проекта, с которого история берет свое начало, она мне нравится, поэтому она тут :3

"Когда до презентации продукта оставалось всего несколько часов, и были добавлены все недостающие ассеты, выяснилось, что памяти то в устройстве не хватает."

В этой статье описан простой вариант управления подгруженных в память ресурсов, которые можно достаточно быстро внедрить. Идея для статьи была взята из опыта разработки XR приложения MR Diorama и не освещает каких-то инновационных открытий.

Подгрузка ресурсов в Unity работает примерно следующим способ: при загрузке сцены прогружаются все ресурсы в сцене, в том числе для неактивных объектов, затем подгружаются ресурсы для всех префабов, на которые есть ссылки, и ресурсы для всех префабов, на которые ссылаются уже подгруженные префабы. iPad 2016 года предлагает 2Гб оперативной памяти, и как же уместить в этом объеме что-нибудь детализированное и в больших количествах? Решение всего одно - разделять ресурсы и подгружать при необходимости, а способов несколько:

  • AssetBundles - это рекомендованный командой Unity способ раздилить ресурсы и использовать их по мере востребования.

  • Resource - Нерекомендованный способ, при котором ресурсы хранятся в папке Resource и подгружаются\выгружаются вручную.

  • Scene - Использование сцен как контейнеров для набора ассетов.

В моем случае проблема с оперативной памятью пришла резко и времени на какое-то переделывание почти не было, поэтому был выбран путь через сцены, т.к. AssetBundles предполагают заранее заготовленную базу для работы с ними, а Resource - не надежная из-за поиска по названию, ну и так же в этих случаях необходимо вручную подгружать и выгружать ресурсы.

И так, реализация крайне простая, в моем случае при наведении камеры устройства на разные AR маркеры ожидается разное поведение и UI, поэтому было принято решение на каждый маркер создать по сцене, в которой будет и UI и префабы с необходимым материалом, при сканировании маркера - нужная сцена подгружалась, а старая, если такая есть, выгружалась, освобождая память. Так же для позиционирования объектов в подгруженных сценах им передавалась информация о текущем положении проекции маркера в виртуальном пространстве.

После чего iPad стал справляться с этим приложением, и удачно подгружал и выгружал ресурсы:

Первый удачный запуск без OutOfMemoryException.
Первый удачный запуск без OutOfMemoryException.

В заключение стоит сказать, что при небольшом количестве сцен в проекте, использование "сцен-баз данных" является самым быстрым и безопасным способом разделять подгрузку, так как не нужно вручную подгружать и выгружать каждый ресурс, следить за их жизненным циклом и т.д..

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.