Найти тему
Stronghold of gamedev

Игры изнутри : циклы обработки данных и падение производительности

Оглавление

Разработка игр не только сложна, но и крайне интересна. Каждая задача имеет множество решений, лучший подход к которому способны отыскать лишь хладнокровные профессиональны.

Задумывались ли вы, как убивается оптимизация игры? Отодвинем в сторону графическую составляющую игры. Кривой код не имеет границ, даже в пиксельной игре ваша игровая печка может начать просить о пощаде.

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

Предисловие

Для тех кто не знает, каждый объект в игровой сцене (уровне), существует абстрактно от остальных, например игровой персонаж может иметь скрипты передвижения, инвентаря, системы здоровья и так далее, а ящик скрипт на разрушение, а в добавок, например, превращение в дракона.

Первопроходцы Awake и Start

Метод пробуждения Awake выполняется сразу после инициализации сцены или добавления на неё предмета, например из инвентаря.
Если объект активен, а скрипт, в котором выполняется метод - нет, он выполнится всё равно.

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

Risen 3
Risen 3

Например в игре Risen, в начале путешествия персонаж не имеет навыков вскрытия замков, её прокачка вариативна. Большие механики выносятся в отдельные скрипты и очевидно предположить, что в те часы, когда механика недоступна, скрипт пользы не имеет и должен быть выключен, просчитав лишь Awake метод.

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

Основной Update

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

Здесь пишутся механики передвижения (не физикой, для неё есть FixedUpdate), механики взаимодействия, работа с камерой и всё, что только можно себе представить.

Разбавляю текст ложкой дегтя
Разбавляю текст ложкой дегтя

А теперь представьте себе такую картину : неопытные ребята из прошлого примера реализуют механику навыка в Update, но додумываются поставить условие :
если навык не изучен = не выполнять механику каждый кадр
казалось бы FPS сохранены, однако теперь каждый кадр выполняется проверка условия.

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

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

Сопрограммы

Возможным спасением производительности являются сопрограммы, или их более красивое название - корутины. Они работают абстрактно от методов Update и их идеально использовать скажем для отравляющих эффектов, либо конкретных миссий в коде.

Словно посыльный, корутина выполняет расчеты и циклы, возвращая в случае успеха финальный результат.

-4

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

По достижению цели она закроется и не будет поедать ресурсы.

Выводы

Однажды товарищ кинул мне небольшую демку, он хотел показать красивый эффект взрыва и интерации с миром. На сцене стояло около 15 бочек, на которые должны были упасть предметы и вызвать взрыв.

Несмотря на полу-пустое пространство вокруг, фпс был не высок в простое и не сильно снижался при взрыве, в чем секрет? В том, что каждый кадр проверялась переменная, отвечающая за "живость" бочки, которая "умирала" в случае контакта с определенным кубом, после вызывался эффект взрыва и бочка удалялась.

После прочтения 1 статьи, мой товарищ переосмыслил свою жизнь и для своей разрушительной магии стал использовать отдельный метод определения коллизий OnCollisionEnter и метод OnDestroy, вызываемый за кадр перед уничтожением объекта, дабы разгрузить Update. Надеюсь и эта статья кому-нибудь поможет или хотя-бы покажется интересной!

Случайные статьи на канале о разработке игр :
Софт, где одевали ведьмаков и ассасинов
Мягкие тела в играх
Как работает физика ткани в играх