Сейчас активно изучаю различные способы оптимизации своих приложений на Unity3D и столкнулся с таким вопросом, который оказался достаточно интересным.
В Unity3d изначально реализована функция AssetBundle через которую можно сделать динамическую подгрузку игровых объектов, насколько я понял в основном используют именно эту технологию для оптимизации игровых ресурсов в памяти.
Но, при подробном ознакомлении у меня сразу же возникло кучу вопросов. AssetBundle использует такую технологию при которой пакет предназначенный для загрузки не может быть предварительно загружен в память частично, то есть нет возможности
подгрузить только один используемый объект из ассета чтобы взаимодействовать с ним, Unity получается так что грузит весь ассет бандл целиком чтобы например взять оттуда один объект, и получается так что загружаются сразу все обьекты в память чтобы использовать только один объект из ассета. И происходит напрасная нагрузка памяти. Если бить сцену на множество частей чтобы в дальнейшем динамический ее подгружать даже если закрыть глаза на то, что это долго, то получится так что для каждого ассета получится очень много одинаковых текстур и всего прочего мусора и по итогу все бандлы будут занимать намного больше места нежели упаковать все в один бандл. Это первый момент с которым я столкнулся при изучении этого который касается именно практической части.
Теперь немножко теории, в голове я уже продумывал очень много различных вариантов для реализации динамической подгрузки локаций в приложениях. Но, не смотря на то, что я работаю с этим движком уже достаточное время, этот вопрос оказался действительно сложным для меня, отчасти наверное так же и потому-что в топ играх которые я видел очень криво затронут вопрос с производительностью и оптимизацией, наверное это общая и главная проблема всех проектов. Самый простой вариант реализации который я составил в голове когда подумал о динамической подгрузке (давайте разберем на примере шутера) - это сканировать радиус вокруг персонажа в пределах условно 20 метров и подгружать в память именно те объекты которые попадают в зону видимости этого радиуса.
Но, если рассматривать эту теорию на практике, получается так, что не смотря на то, что AssetBundle может условно динамический загружать пакеты, делает он это по какой то из причин с подтормаживанием основного потока игры, и все равно получаются тормоза и падение фпс в игре, я думаю это возможно связано с самой функцией инициализации асинхронной загрузки бандла и возможно в чем то еще. Эта проблема возникала не только у меня, я прошерстил различные форумы где люди аналогично сталкивались с этой проблемой. Чтобы такого не было, нужно каким то образом загружать один большой бандл сразу же при старте игры (точнее загружать именно заголовки) и потом дергать с него ресурсы, но такой возможности нету в Unity насколько мне известно.
Либо отказываться от такой логики при которой сканируется сразу весь пул объектов в радиусе 20метров от игрока с последующей подгрузкой этих объектов. Как сделать по другому, пока не приходит в голову, хотя мысли есть.
Хотелось бы узнать ваше мнение на этот счет, возможно кто-то сталкивался с этой проблемой или знает какую то информацию. Как динамический подгружать уровень правильно чтобы была реальная оптимизация проекта а не костыль?