Разработка игр не только сложна, но и крайне интересна. Каждая задача имеет множество решений, лучший подход к которому способны отыскать лишь хладнокровные профессиональны.
Задумывались ли вы, как убивается оптимизация игры? Отодвинем в сторону графическую составляющую игры. Кривой код не имеет границ, даже в пиксельной игре ваша игровая печка может начать просить о пощаде.
В первой статье из серии я опишу методы обработки данных из скрипта движком, как они работают и конкретные примеры. И так, когда начинается обработка данных?
Предисловие
Для тех кто не знает, каждый объект в игровой сцене (уровне), существует абстрактно от остальных, например игровой персонаж может иметь скрипты передвижения, инвентаря, системы здоровья и так далее, а ящик скрипт на разрушение, а в добавок, например, превращение в дракона.
Первопроходцы Awake и Start
Метод пробуждения Awake выполняется сразу после инициализации сцены или добавления на неё предмета, например из инвентаря.
Если объект активен, а скрипт, в котором выполняется метод - нет, он выполнится всё равно.
Start же выполняется лишь при активации скрипта, что очень важно, ведь на стадии загрузки объекты друг друга найти не в силах, а в методе Start можно единоразово определить связи, ссылки и переменные.
Например в игре Risen, в начале путешествия персонаж не имеет навыков вскрытия замков, её прокачка вариативна. Большие механики выносятся в отдельные скрипты и очевидно предположить, что в те часы, когда механика недоступна, скрипт пользы не имеет и должен быть выключен, просчитав лишь Awake метод.
Неумелые же ребята, даже если додумаются не складировать механики в одном скрипте, вряд ли его отключат и сразу после загрузки вы получите свойственные лаги, которые просчитывают ненужные переменные и ссылки.
Основной Update
Метод Update можно назвать основным, он выполняет расчеты, считывает ввод и как правило руководит созданными разработчиком методами каждый кадр.
Здесь пишутся механики передвижения (не физикой, для неё есть FixedUpdate), механики взаимодействия, работа с камерой и всё, что только можно себе представить.
А теперь представьте себе такую картину : неопытные ребята из прошлого примера реализуют механику навыка в Update, но додумываются поставить условие :
если навык не изучен = не выполнять механику каждый кадр
казалось бы FPS сохранены, однако теперь каждый кадр выполняется проверка условия.
Предполагаем, сколько включенных и искусственно ограниченных скриптов на сцене, сколько проверок в кадр выполняется и какой удар по производительности это наносит.
Речь идет о неиспользуемых механиках. Проверки часто изменяемых условий, таких как столкновения, падения и урон - заслуживают грузить систему.
Сопрограммы
Возможным спасением производительности являются сопрограммы, или их более красивое название - корутины. Они работают абстрактно от методов Update и их идеально использовать скажем для отравляющих эффектов, либо конкретных миссий в коде.
Словно посыльный, корутина выполняет расчеты и циклы, возвращая в случае успеха финальный результат.
Предположим в пошаговой стратегии мы отдаем отряду команду отправится к точке, передавая корутине информацию и запуская её.
Она будет выполнятся примерно так :
если текущее положение != (не равно) указанному положению
двигаться в направлении (указанное положение)
По достижению цели она закроется и не будет поедать ресурсы.
Выводы
Однажды товарищ кинул мне небольшую демку, он хотел показать красивый эффект взрыва и интерации с миром. На сцене стояло около 15 бочек, на которые должны были упасть предметы и вызвать взрыв.
Несмотря на полу-пустое пространство вокруг, фпс был не высок в простое и не сильно снижался при взрыве, в чем секрет? В том, что каждый кадр проверялась переменная, отвечающая за "живость" бочки, которая "умирала" в случае контакта с определенным кубом, после вызывался эффект взрыва и бочка удалялась.
После прочтения 1 статьи, мой товарищ переосмыслил свою жизнь и для своей разрушительной магии стал использовать отдельный метод определения коллизий OnCollisionEnter и метод OnDestroy, вызываемый за кадр перед уничтожением объекта, дабы разгрузить Update. Надеюсь и эта статья кому-нибудь поможет или хотя-бы покажется интересной!
Случайные статьи на канале о разработке игр :
Софт, где одевали ведьмаков и ассасинов
Мягкие тела в играх
Как работает физика ткани в играх