Немного о важности игрового кода.

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

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

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

Скорее всего, содержимое исходника мне бы было все равно, но твит об этом бросил настоящий вызов! Неужели действительно хороший платформер написать сложно!? ? я с азартом отправился читать исходник.

Вначале чтение протекало хорошо и не принужденно, но к середине класса я начал терять суть происходящего, что именно реализует данный класс!? Тут тебе и логика персонажа, его анимация, рендеринг, различные эффекты, обработка характеристик — пока вроде все логично… Опа! А код от финального босса, что тут делает? ? логика работы камеры тоже тут… Хм.. А потом и физика, баффы и дебафы и много чего еще, мало имеющее напрямую к персонажу. К концу листинга у меня создалось полное ощущение того, что я прочитал весь код игры, хоть это и не так.

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

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

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

«Пиксельная 2D игра, а грузится и тормозит хуже, чем Баттлфилд 12, оптимизируйте!»

«Баг на баге и разработчики не хотят ничего исправлять, прошло уже несколько месяцев после релиза, а апдейтов так и нет!»

? таких комментариев хватает в Steam для разных игр от разработчиков одиночек или небольших команд. А все почему? Потому что разработчики напишут не поддерживаемый код и попробуй потом что-то добавь или исправить! Это хорошо, если он получится быстрым, без багов и обновлений с новым контентом для игры более не планируется.

? в целом я понимаю разработчиков: когда делаешь игру год, два и больше, а потом выпускаешь — камень с плеч! Но когда игра начинает плохо работать, требуются еще исправления и доработки — открываешь свои исходники и видишь такое! Конечно проще закрыть исходники обратно и игнорировать комментарии о том, что игра тормозит, утешая себя мыслями:

«В следующий раз сделаю правильно!»

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

Но, эта запись затевалась не ради того, чтобы ругать код весьма и весьма милой игры Celeste. Просто, размышляя об этом, я вспомнил свое начало в геймдеве.

У меня не было профильного образования, его тогда вообще ни у кого не было. Это сейчас можно найти какие-то курсы по гейм-дизайну, школы, обучающие разработке игр, и многое другое. Но когда я начинал все это осваивать — не было ничего! Да чего уж там, даже интернет был в жестком дефиците! В общем, все приходилось осваивать методом проб и ошибок.

Тогда мы работали в команде и разрабатывали небольшие коммерческие казуальные игры. На разработку уходило от трех до шести месяцев. Писал я код как придется, мало задумывался об архитектуре, главное игра и релиз по быстрее! Ведь лопата для денег уже заждалась своего часа!

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

«Редкий плавающий баг — это не страшно!»

Стоит отметить, что в те времена не было таких классных и подробных дебаггеров как сейчас, которые при падении игры дают всю необходимую информацию о том, что произошло. ?гра просто падала с сообщением типа: «в запрашиваемом участке памяти ничего нет. Адрес памяти такой-то». Тут и Ёжику понятно, что происходит обращение к уничтоженному объекту, но где, почему и в какой ситуации!?

Тогда у меня была примерно такая же реализация: весь основной код игры был в одном классе! Вся логика, управления персонажем, примитивный ?? и многое другое. ЧО ДЕЛАТЬ? ?здатель пишет письма:

«Нужно срочно исправить эту ошибку, вот вам еще 20 багрепортов, поторопитесь!»

Сказать, что я был в панике — это ничего не сказать!

Я нашел тогда какие-то способы отлова ошибок, думал о том, чтобы внедрить их в игру. Но для этого надо было расставить в коде триггеры на ошибки, сделать полноценный вывод информации об ошибке, отправить эту версию в релиз и ждать новых баг репортов с уже какими-то новыми подробностями о том, что происходит и не факт что это помогло бы — опыта то нет! Репутация была слишком важна для меня, потому что мы только начинали этот не легкий путь в геймдеве и я решил, что нельзя пользователей использовать в качестве подопытных хомячков, причем за их же деньги. Собрался с духом и начал очень быстро переписывать всю игру.

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

Стоит ли говорить, что после этого я сильно изменил свое отношение к коду, к архитектуре игры и вообще? Конечно ДА! Тогда в моей голове надежно закрепился лозунг:

«?гра должна работать так же стабильно, как программное обеспечение для космических кораблей!»

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

К тому же пару раз случалось даже неожиданное: открыв свой старый код у меня возникало приятное «Ого! Как круто и как я до этого додумался!?». Но не смотря на это, я не считаю себя крутым программистом, думаю на 3+ моя оценка. Все это потому, что я не работал в команде программистов и многие профильные слова по прежнему скрывают от меня какой-то таинственный смысл. Считаю, чтобы стать настоящим программистом, нужно работать в команде и не отвлекаться на всякие рисульки и анимашки.

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

? именно поэтому тапки принадлежат не тому, кто выпустил раньше свою игру, а тому, кто выпустил классную игру! А классная игра — это крутая смесь из хорошего геймплея, замечательного визуального ряда, приятного звука, хорошей производительности и многое другое. ? тут очень важно соблюдать баланс, ведь достаточно какой-то одной из этих вещей чуть-чуть начать выбиваться из общей массы и сразу вся игра превращается в «пересоленный борщ»!

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

P.S.: Сохранил себе исходник Celeste, в надежде выдернуть от туда физику управления персонажем, потому что это действительно важная и интересная вещь. Но, чувствую, это будет не простой задачей.