Один Layout на всю игру.

техническая поддержка по Construct 2

Сообщение Один Layout на всю игру.
» 05 июн 2019, 22:04

Sealrean, Постараюсь объяснить, как я вижу некоторую правильную часть Твоей реализации...
В Проекте создай 2 layout, один для самой игры "Game" и второй для Дополнительной графики, монстров и т.п. "Storage", что будет являться у тебя неким хранилищем для НЕиспользуемых и НЕнужных сразу при старте игры объектов.
1) На уровне "Game" сразу располагаешь все НУЖНЫЕ тебе для первых минут игры объекты, графику и т.п. Всё то, что должно загрузится сразу и с чем уже можно работать.
2) На уровне "Storage" располагаешь всё дополнительное, что может появляться по ходу игры и что сразу НЕ требуется. Например всякие монетки, бонусы, игровые плюшки, всяких монстров, которые нужны гораздо позже, а так как у них куча анимаций, они весят много. + Тут же можно разместить всякие окна Проигрыша/Выигрыша, кнопки, текста. Сюда можно много чего запихнуть изначально ненужного, что позволит самому уровню с Игрой стать "легче", загружаться Быстрее, без всего этого
---
В С2 можно отследить объём используемой видеопамяти в данный момент в игре выводя в тексте например системное ImageMemoryUsage. Правда работает это только в Экспортированном проекте
Изображение
На основе этого, можно отследить как "Забивается" память. Пример:
Ты разделил объекты на Игру и Хранилище, как я выше описал.
При старте Игры у тебя на уровне находятся лишь все необходимые объекты для первых минут игры. Объём загруженной видеопамяти - ImageMemoryUsage у тебя равен 100мб. Далее, в процессе игры убиваются монстры, с них выпадают бонусы (которые через Create Object ты создаёшь, а их Инстансы-Оригиналы находятся на уровне хранилища), выпадают монетки с разбиваемых ящиков, к середине игры пояляются новые сильные монстры... Окна Выигрыша/Проигрыша. Это всё дополнительно "Забивает" видеопамять игры и вот у тебя уже не 100мб, а 150мб. Но это Разовое увеличение. В плане создание 1-го доп. монстра 1 раз прибавит к памяти его "вес", а создавать далее ты их можешь хоть сотню.
Затем, когда уровень Пройден:
Ты хочешь -
Sealrean писал(а):При переходе на следующий игровой уровень очищать layout, и загружать json с уже новым окружением.

То есть играть на том же уровне и его НЕ перезагружать, я правильно понял ? Тогда у тебя практически без видимых изменений сразу перезапустится тот же уровень (layout), но уже со всем нужным для другого уровня. При этом, объём видеопамять игры останется на том же уровне и будет равен 150мб, так как из памяти ничего не выгрузилось. Это позволит "вновь" первым появившимся объёктам на уровне загрузиться/создаться вообще моментально, что большой плюс.
Но есть и минусы. У тебя будет нарастать загрузка видеопамяти, если например на 5м - 10м уровне будут появляться вообще новые объекты ранее не создаваемые, это ещё больше увеличит потребление видеопамяти... 200-300мб и т.п.
Кроме того, в большой игре есть всякие нюансы создания первоначального положения объектов на уровне при старте, всякие циклы, проверки... Это всё сложно в 1 игровой тик уместить. Иначе всё это будет визуально видно игроку, все эти микро-задержки. Поэтому в это время на экране должна висеть какая-то псевдо заставка, или окно, пока у тебя уровень целиком не сгенерировался. Это сделать всё можно, если продумать нормально.
---
Если же ты просто сделаешь Restart layout и загрузишь всё в игре для нужного тебе уровня, то видеопамять освободится, у тебя будет снова занимать она всего изначальные 100мб. Но уровень будет некоторое загружаться и + кратковременные изначальные микро-лаги в зависимости от устройства и общего объёма загружаемой графики на уровне.
---
Как по мне, 1 вариант, делать всё на одном уровне без Рестарта вообще более предпочтителен и гладкий. Главное, чтобы выдеопамять при таком подходе не выходила за какие-то рамки дозволенного и тянула на всех слабых устройствах.
К слову, в своей игре тестил нечто подобное, игра мобильная, с загрузки видеопамяти 90мб уменьшил до 55мб и разницы вообще не заметил. Чуть быстрее загружается при старте уровня, но на FPS это ни как не влияет. Так что, делай всё на 1 уровне, без его перезагрузок. Это нормальный подход. Но тестировать не забывай.
---
p.s. Есть какой-то плагин, для выгрузки из памяти конкретных объектов, погугли, слышал вроде норм, но сам не юзал
Изображение Изображение
Аватара пользователя

Игродел
Сообщений: 2472
Я тут с 26 сен 2013
Откуда: Екб
Двиг: C2
VK: indiewolf_game
Репутация 310 [ ? ]

Сообщение Один Layout на всю игру.
» 06 июн 2019, 15:38

AferisT писал(а):То есть играть на том же уровне и его НЕ перезагружать, я правильно понял ?

Премного Благодарен Вам, AferisT, за столь содержательный ответ! Да, Вы всё поняли верно. Приятно знать, что есть неравнодушные люди готовые оказать помощь и потратить на это своё лично время. Некоторые вещи, конечно, уже были разобраны постами выше. Тот же момент с использованием layout-хранилища, который описывал DeX, например. Но, сам факт того, что Вы также упомянули об этом методе вселяет больше уверенности в его использовании и жизнеспособности. :good2:

Очень порадовала новость о существовании плагина для очистки памяти. Очень важный инструмент, на мой взгляд. Воспользовавшись Вашим советом погуглил и, кажется, нашёл его. Правда он платный. 1 249,90 руб. на официальном сайте scirra. На всякий случай оставлю здесь ссылочку для тех, кому может пригодиться:

MM_Unloader (unload from memory)

Также выражаю отдельную Благодарность за "ImageMemoryUsage". До сих пор я об этой функции не знал.

P.S. Думаю, что наличие прелоадера в момент перезагрузки layout-а вполне себе классическое (must have) решение для любого проекта. wink::
Изображение
Аватара пользователя

Участник
Сообщений: 26
Я тут с 17 фев 2019
Откуда: СПБ
Двиг: C2
Лицензия: Personal
Репутация 3 [ ? ]



Вернуться в Вопрос-Ответ по Construct 2

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх