Unity3D динамическая подгрузка локации

Раздел, посвящённый самому важному - скорости.

Unity3D динамическая подгрузка локации

Сообщение ДобрыйБарин 02 сен 2018, 10:55

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

Хотелось бы узнать ваше мнение на этот счет, возможно кто-то сталкивался с этой проблемой или знает какую то информацию. Как динамический подгружать уровень правильно чтобы была реальная оптимизация проекта а не костыль?
ДобрыйБарин
UNец
 
Сообщения: 9
Зарегистрирован: 02 сен 2018, 10:46

Re: Unity3D динамическая подгрузка локации

Сообщение lawson 02 сен 2018, 11:42

нужно каким то образом загружать один большой бандл сразу же при старте игры

Грузите, кто вам запрещает!?
Последний раз редактировалось lawson 02 сен 2018, 11:52, всего редактировалось 2 раз(а).
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Unity3D динамическая подгрузка локации

Сообщение ДобрыйБарин 02 сен 2018, 11:45

lawson писал(а):
нужно каким то образом загружать один большой бандл сразу же при старте игры

Грузите, кто вам запрещает!?

Совесть, не могу под 100% занимать оперативную память у игроков.
Если вы знаете как загружать только заголовки из бандла чтобы он полностью не лежал в памяти, поделитесь.
ДобрыйБарин
UNец
 
Сообщения: 9
Зарегистрирован: 02 сен 2018, 10:46

Re: Unity3D динамическая подгрузка локации

Сообщение lawson 02 сен 2018, 11:52

сканировать радиус вокруг персонажа в пределах условно 20 метров и подгружать в память именно те объекты которые попадают в зону видимости этого радиуса.

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

А использовать бандлы для динамической ПОДгрузки локаций это просто, я такое уже делал - бесшовный переход между уровнями.

Если вы знаете как загружать только заголовки из бандла чтобы он полностью не лежал в памяти, поделитесь.

Увы, чтобы загрузить объект из бандла, нужно этот бандл загрузить полностью, поэтому нужно научиться правильно оперировать загруженными данными - загружать когда необходимо и выгружать когда уже использовали.
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Unity3D динамическая подгрузка локации

Сообщение ДобрыйБарин 02 сен 2018, 12:08

lawson писал(а):Оптимизация в крупных проектах работает не так.
Скрытый текст:
Хотя мало кто знает так как это коммерческая тайна используемого движка


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

А использовать бандлы для динамической ПОДгрузки локаций это просто, я такое уже делал - бесшовный переход между уровнями.

Если вы знаете как загружать только заголовки из бандла чтобы он полностью не лежал в памяти, поделитесь.

Увы, чтобы загрузить объект из бандла, нужно этот бандл загрузить полностью, поэтому нужно научиться правильно оперировать загруженными данными - загружать когда необходимо и выгружать когда уже использовали.

Вы дали ссылку на пример с рендерингом камеры, насколько я знаю, камера не рендерит объекты которых не видит. А Occlusion Culling является лишь дополнением к тому, чтобы конкретно указать ссылки на статические объекты на сцене. Но, это не относится к динамической подгрузки локации, все объекты которые скрывает камера по средствам Occlusion Culling по прежнему находятся в памяти. Разве нет?
Если вы такое уже делали, было бы неплохо подкрепить каким то примером.
ДобрыйБарин
UNец
 
Сообщения: 9
Зарегистрирован: 02 сен 2018, 10:46

Re: Unity3D динамическая подгрузка локации

Сообщение lawson 02 сен 2018, 13:04

Если вы такое уже делали, было бы неплохо подкрепить каким то примером.

Это было около 2х с половиной лет назад, совместно с 3д художником делал проект под WebGL, большой размер приложений для этой платформы не приветствуется, поэтому сделал подгрузку уровней с сервера через бандлы, каждый бандл весил от 10-15 мб, все грузилось и выгружалось в процессе игры.

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

Это элементарный тип подгрузки для линейного прохождения, но принцип работы один и тот же для любого вида проекта: загрузили, использовали, выгрузили. Тут лучше иметь несколько мелких бандлов чем один большой.
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20


Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1