Привет, Хабр! Это вторая статья по разработке моего проекта ALT CITY: Online, суть которого кратко можно описать как “ГТА Онлайн для мобильных устройств”. Если вы не читали первую часть, то она тут.
Во второй части: главные сложности разработки игры с открытым миром на Unity, как появилось более 9000 игроков, ожидающих игру, первая встреча с хейтом и запуск тестирования игры. Приглашаю пережить со мной все эти события, которые произошли за последние 4 месяца.
Реакция на прошлую статью
Как человека, который никогда до этого не писал статьи — отклик на первую статью меня порадовал. На Хабре она собрала почти 13к просмотров, а на DTF — 7к. Более того, статья даже попала в дайджест AppTractor. Учитывая, что читаю я его часто, было приятной неожиданностью обнаружить там свою статью:
Приятно, что тема вызвала интерес у хабровчан, среди многочисленных комментариев были действительно обоснованные вопросы/претензии, которые касались оформления статьи, потом того, что на видео непонятно, что происходит (это действительно так, в этот раз будет лучше). Все это прочитал, спасибо, что помогаете делать лучше.
Но больше всего я удивился, когда обнаружил на одном популярном портале по разработке игр тред с обсуждением написанной мной статьи. Вот там было интересно. Люди обсуждали статью, даже не удосужившись прочитать ее, но зато напихали мне знатно. Было там что-то из разряда “чувак делает первую игру и уже решил делать гта”, “совершает классическую ошибку”, “на Unity сделать такую игру не сможет”. Ну, ок.
Также я получил несколько предложений инвестировать в игру, познакомился с большим числом специалистов, с некоторыми из которых я уверен мы в будущем сработаемся. В сообщество, посвященное игре, после статьи вступило около 200 человек.
В общем, учитывая, что изначально я сильно сомневался, стоит ли вообще писать что-то, сомнения были напрасны - затраченные усилия 100% стоят полученной отдачи. Поэтому всем начинающим разработчикам я рекомендую рассказывать про свои проекты, хотя бы потому, что это даст вам шанс понять, насколько вообще интересна ваша игра, получить первый фидбек по ней. Это действительно ценная информация.
С момента публикации прошлой статьи произошло очень много всего. Но обо всем по порядку.
Во-первых, конечно, была проделана огромная работа над самой игрой: была скорректирована архитектура проекта, так как прошлый сетап предполагал очень долгую подготовку смоделированной карты. Подготовка происходит с помощью заранее написанного скрипта, но из-за специфики того, как это было сделано, подготовка карты порой могла занимать до 5 часов. То есть все эти 5 часов Юнити прорабатывает карту, и работа над игрой на это время останавливается. Как вы возможно понимаете, такая “скорость” предполагает очень долгие итерации и делает невозможно больным редактирование карты - то есть после каждого редактирования приходилось ждать по 5 часов, чтобы увидеть изменения уже в самой игре. Новая архитектура позволила в принципе исключить этот этап из пайплайна.
Во-вторых, была тщательно проработана механика персонажа - настроены анимации, механика прыжков (вычисление того, какой высоты препятствия перед персонажем и какую анимацию при каких обстоятельствах надо включить), система модификации персонажа, синхронизация состояния игрока между устройствами (тут есть много разных подходов, но суть в том, что ты всегда балансируешь между точностью синхронизации состояния и количеством отправленных пакетов на сервер и соответственно с сервера на другие устройства).
Показательное видео проекта, октябрь 2020
В-третьих, была добавлена система, которая позволяет ограничивать количество игроков, которые должны получить обновление состояния конкретного игрока (или другого сетевого объекта). Пример - игроку на одном конце карты не нужно знать, что делает игрок на другом конце карты. Сервер посылает каждому игроку только нужную для каждого игрока информацию.
В-четвертых, были наконец добавлены бандлы (Asset Bundle - способ хранения ассетов в Unity с возможностью подгрузки в уже готовые билды). Это позволило также увеличить скорость итераций на iOS устройствах - это было критично, так как скорость билда для iOS достаточно медленная.
Как можно заметить, огромная часть работы была направлена на ускорение разработки и самого пайплайна. Прямо как завещал Генри Форд.
И это дает свои плоды. Но это далеко не все, что было сделано.
Одно из последних изменений, произошедших в игре - это улучшенная оптимизация. Благодаря муторному профайлингу удалось выявить, что вызывало огромное количество “фризов” (фриз - ситуация, когда игра на доли секунд замирает), почему отрисовка давалась настолько тяжело и на что уходили сотни мегабайт оперативной памяти. Ниже вы можете посмотреть небольшое видео, которое я записал для участников нашей группы ВКонтакте про оптимизацию. Если вкратце, производительность игры (на минимальных настройках графики) на примере телефона Redmi Note 7 была увеличена с 15-20 кадров в секунду до >30 кадров в секунду. Было убрано огромное количество “фризов”. То есть по сути до оптимизации играть на данном телефоне было невозможно. Сейчас можно играть без проблем.
Конечно, те, кто разбираются, обратят внимание, что в кадре нет кучи других игроков, авто и т. д. Тесты, которые я проводил, показывают, что 20-30 игроков в кадре не рушат игру, не делают ее “неиграбельной”. Авто тоже меняют историю не кардинально. Но реальные тесты, которые, я надеюсь, уже скоро будут проводиться, покажут, где и какие проблемы имеются.
Также наша группа ВКонтакте набрала хорошие обороты - в ней уже больше 9 тысяч человек (без накрутки, естественно), участники достаточно активно комментируют новые публикации, участвуют в обсуждениях, предлагают свои идеи, за что им большое спасибо!
Не могу не рассказать о том, что на сайте ALT CITY: Online около 5000 человек оставили свои адреса электронной почты, чтобы первыми узнать, когда выйдет игра!?
Но не все было так радужно, конечно же. Первая и, наверное, самая большая неприятность - перенос начала открытого бета тестирования и соответственно перенос релиза игры. Проект такого масштаба я делаю первый раз в жизни, поэтому вполне ожидаемо некоторые этапы в реальности заняли сильно больше времени, чем предполагалось. Честно говоря, ощущения не из приятных - на тот момент игру уже ждали около 3 тысяч человек, которые буквально каждый день спрашивали про игру. Можете представить их эмоции, когда им сказали, что игра переносится. Поэтому да, такой просчет я допустил, и это было очень гадкое чувство. И, забегая вперёд, я допустил такой просчёт позже ещё раз.
Вторая неприятность (даже, скорее, сложность) - объём работы, который нужно было проделать для подготовки игры к тестированию к новой дате - 29 декабря. Конец ноября и весь декабрь (плюс чуть чуть январь) я работал день и ночь напролёт прерываясь только на сон и еду. Вот в буквальном смысле. До этого я думал, что много работаю, но этот месяц показал мне, что такое на самом деле много работать. Это был самый настоящий месяц дикого кранча. Марафон на износ. Но я его прошёл, и считаю успешно - уже 29 декабря у меня на руках был готовый к тесту билд. Ну на тот момент я так думал.
Запуск тестирования ALT CITY: Online
29 декабря, в дату предполагаемого запуска закрытого теста игры, при беглом тестировании (на другое тестирование времени просто не было) я заметил очень неприятный баг - некоторые игроки не были видны друг другу. Хромала синхронизация. Эта проблема не была видна при тестировании на двух клиентах, но когда я стал тестировать одновременно 5-6 клиентов, эта ошибка проявилась.
Пришлось в срочном порядке решать эту проблему. Решил я ее за несколько дней, что уже сделало невозможным запуск теста 29 декабря, как я озвучивал ранее. А ведь предстояло ещё получить одобрение магазинов, ведь даже одобрение тестовых версий может занимать до недели. На деле в Google Play одобрение заняло порядка 4 дней, а в AppStore - около суток. Но я не хотел запускать тест только одной платформы, поэтому пришлось ждать. С горем пополам, 8 января все версии уже были одобрены и я был готов запускать тест.
Этот день был напряженным - с утра появилась проблема со входом в игру через ВКонтакте, причём она появляется примерно у половины пользователей. Соответственно о проблеме я уже узнал в процессе запуска теста. Другая проблема была с загрузкой бандлов с сервера - андроид версия почему-то не хотела их загружать. Все это надо было срочно решать. Спасло то, что обновления в сторах проверяются максимально быстро - от получаса до часа. После того, как я убедился, что все готово, предстояло вручную разослать приглашения всем, кто оставил свои адреса. Да, можно было бы сделать общедоступную ссылку, но по некоторым соображениям было принято решение добавлять тестировщиков вручную.
После запуска теста выявилось много багов, но один из них был критичным даже для текущего состояния игры - со временем на месте спавна фпс падал до 2. Из-за этого в группе можно наблюдать сообщения о плохой оптимизации игры, хотя причина на самом деле оказалась в том, что сервер не удалял вышедших игроков и они грузили систему. Обновление сервера, сделанное буквально за 5 минут, решило эту проблему - даже не пришлось обновлять клиент.
Так вот, на днях был успешно запущен первый этап теста - была запущена тестовая версия игры, сервер и обработано порядка 450 заявок на участие в закрытом тестировании. На момент написания статьи уже 3 дня как идёт тестирование - люди играют, изучают карту. Сервер я кстати не отключаю, даже сейчас можно подать заявку на тестирование, получить приглашение стать тестировщиком, скачать игру и поиграть самому.
Изначально планировалось запустить сразу открытый тест игры. Причём предполагалось, что состояние игры будет близко к релизному варианту. На деле некоторые вопросы заняли сильно больше времени, чем предполагалось, и пришлось адаптироваться под сложившуюся ситуацию: было принято решение запускать игру в несколько этапов. Вначале было решено запустить закрытое тестирование основных механик, тестирование синхронизации игроков и общей стабильности программного продукта на девайсах. Задача собрать как можно больше информации об ошибках игры, о ее стабильности, и прочно зафиксировать текущий результат. Это первый этап тестирования. Второй этап - открытое тестирование предрелизной версии игры. И третий этап - релиз игры на русскоязычных рынках. Так называемый софт лонч.
Справедливости ради, игра на данный момент является скорее демо версией конечного варианта, так как геймлпейные механики в ней на данный момент отсутствуют - они находятся в разработке и запускать их даже в закрытое тестирование в данном состоянии нельзя. Несмотря на это, я вижу, как в игру постоянно играют люди, в сообществе идёт активное обсуждение. Только за 3 дня было выявлено порядка 50 различных багов, что кстати может только обрадовать - тестирование идёт успешно. Кстати, порядка 95 процентов найденных багов - мелочи, которые исправляются за неделю работы. Самое главное, что несмотря на все вышесказанное, я получаю большое количество очень позитивных реакций!
Отдельное спасибо хочется сказать каждому, кто потратил время и установил себе тестовую версию ALT CITY: Online и подробно пишет о найденных багах. Благодаря вам я имею возможность сделать игру на самом деле качественной на базе той информации, которую вы мне предоставляете!
А теперь собственно подробное видео о том, в каком состоянии игра на момент 17 января 2021 года, а именно та самая первая закрытая тестовая версия:
Основные технические сложности при реализации
Все, что я пишу ниже, касается исключительно разработки подобных мобильных игр на движке Unity. Часто эти сложности присутствуют и в других популярных движках, но мы говорим конкретно про Unity. Это больше техническая часть, поэтому будет много слов, понятных разработчикам, но скорее всего непонятных остальным людям.
Так вот. Сложности при создании мобильной онлайн игры в открытом мире можно разделить на две сферы - работа самого открытого мира и нетворкинг. Сегодня мы остановимся на первой части.
1. Оперативная память.
Если игра подразумевает большой открытый мир, а большим в случае с Unity считается все что занимает больше 4000 юнитов на 4000 юнитов (обычно это эквивалентно 16 кв. км), то в вашем мире будет огромное количество ассетов и скорее всего вы не сможете загрузить их разом в память и использовать - просто не хватит оперативной памяти. Так что надо думать, как “стримить” объекты по мере перемещения персонажа по миру. Тут много разных подходов со своими плюсами и минусами. Как правило, смотрят в сторону разбиения основной сцены на кучу маленьких сцен, и потом подгружают их по мере перемещения игрока. Но это только один способ.
Другой вопрос, касающийся оперативной памяти, состоит в том, что на iOS устройствах часто (я бы сказал всегда) бывает очень сложно понять, что именно потребляет память. Профайлер Unity показывает, что игра потребляет например 500 мб, а XCode показывает все 700-800 мб. И все бы ничего, если бы не странная работа самой системы iOS - в своих приложениях вы можете использовать максимум половину от всей оперативной памяти устройства, чтобы вашу игру гарантировано не “убила” система.
Если потребление увеличивается, то появляется большая вероятность, что игра просто вылетит. Например, в моих тестах на iPhone 7 (у которого 2 гб оперативки) игра вылетает уже при использовании 1.2-1.3 гб. Но это опять же раз на раз не приходится. Поэтому в моем случае мы имеем устройства, которые вполне неплохо отрисовывают геометрию и имеют мощные процессоры, но сильно ограничены в оперативке. У того же Redmi Note 7 например ситуация обратная - там 4 гб оперативки, но относительно слабые процессор и видеочип.
2. Дальность прорисовки.
Естественно, все мы хотим, чтобы с любой точки на карте мы могли видеть самые отдаленные объекты и части местности. Как правило, для этого используются LOD’ы (уровни деталей), но мы снова упираемся в проблему с оперативкой - чем больше “лодов” на объекте, тем больше он весит, больше занимает места в оперативной памяти.
3. Floating point precision.
Эта проблема связана с тем, что при нахождении какого-либо объекта дальше чем примерно 2000 юнитов от начала координат, начинаются проблемы с точностью вычислений. Вообще, все называют разные цифры, с каких эта проблема начинается, но на моем опыте это в районе 2000 юнитов от начала координат. Чем обусловлена эта проблема? Она обусловлено тем, что тип данных, который используется для вычисления координат, теряет точность при больших числах. Какие проблемы это может вам принести? Да огромную кучу проблем, на самом деле. Дерганные анимации, мерцающие тени, дергающиеся меши. Проблем действительно много. Решение у этой проблемы есть. Если вкратце - при пересечении определенной координаты сдвигать весь мир в центр. Сделать это можно, но сложно. Причем интересный момент, что на разных устройствах проблемы, связанные с floating point precision, могут возникать, а могут и не возникать. Например, в редакторе Unity и на айфонах даже без сдвига мира на очень отдаленных координатах никаких проблем я не замечал. А вот на Redmi Note 7 все вышеуказанные проблемы появились. Я не понимаю, почему так происходит, поэтому если у кого-то есть ответ на этот вопрос - буду рад почитать.
4. Террейн.
Если вы делаете игру в большом открытом мире (выше мы дали определение “большого” мира), то скорее всего вам придется использовать тайлы террейна. Дело в том, что для красочного и насыщенного мира вам скорее всего придется использовать встроенные террейны от Unity. Они всем хороши, но когда дело касается их асинхронной нагрузки, начинают возникать неприятности. Если на террейне слишком много деревьев, это может привести к фризам. Если на террейне слишком много деталей, это может привести к фризам.
Часто от террейнов уходят к обычным моделям, но это делает невозможным использование деталей (травы, например). Может и есть какое-то решение для этого, но я искал его неделю, пробовал разные варианты и ничего не нашел. Но это все полбеды.
Другая большая проблема, касающаяся террейна - найти и настроить шейдер для террейна. А после того, как ты его нашел и настроил, надо проверить, как он работает на разных устройствах, работает ли вообще. И надо еще быть готовым к тому, что он будет постоянно ломаться.
5. CPU Spikes.
Конечно же, на все, о чем мы выше говорим, нужны ресурсы. Как правило, это ресурсы процессора. Эти “спайки” - как раз причина этих неприятнейших фризов. Учитывая динамическую прогрузку мира, менеджмент ресурсов, сдвиг мира к центру, нагрузка на процессор у таких игр всегда будет большая. Будьте готовы день и ночь профайлить ваш проект, разбираясь, за что отвечает тот или иной процесс, который вызывает тот или иной “спайк”.
6. Рендеринг.
Казалось бы, чем отличается отрисовка в играх с открытым миром и в играх со статичными небольшими уровнями? А много чем. Во-первых, учитывая то, что скорее всего будет использоваться сдвиг мира в начало координат, мы не сможем использовать встроенный Occlusion Culling. Таким образом, отрисовка геометрии сильно утяжеляется. Во-вторых, мы не можем использовать запекание света, так как мир будет подгружаться динамически. То есть тени тоже будут динамическими, а отрисовка теней это тяжелый процесс. Я уже не говорю о невозможности использования статического батчинга. Думаю, объяснять тут не нужно, почему использовать его не получится.
7. Собственно само моделирование мира.
Это не то чтобы большая проблема, просто требует очень много усилий, проработки и умений пользоваться определенными инструментами. Как правило, процедурная генерация помогает создать местность, затекстурировать ее, расставить базовые объекты (деревья, например).
Это самые главные проблемы, с которыми столкнулся я при разработке ALT CITY: Online, и с которыми с вероятностью 99% столкнется любой, кто тоже захочет создать игру в большом открытом мире на Unity. Возможно, какие-то проблемы я упустил, но это вот прям основное.
Что дальше?
На данном этапе на руках я имею продукт, который показал себя как жизнеспособный и действительно интересный игрокам - несмотря на большое количество багов, несмотря на отсутствия как такового геймплея и в принципе недоделанную игру, в онлайне постоянно сидит порядка 10% от всего числа принятых приглашений на участие в тестировании. Люди проводят в игре часы(!) просто изучая мир, взаимодействуя с другими игроками и изучая физику поведения транспортных средств.
Но на данный момент мне стало абсолютно очевидно, что в одного проект я возможно и вытяну, но результат очевидно будет далёк от того, который я представлял себе, начиная разрабатывать ALT CITY: Online. Поэтому последние недели я тщательно изучаю вопрос, как мне правильно разделить работу над проектом и какие конкретно специалисты мне нужны, чтобы сделать весь объём работ качественно и быстро. Проект на глазах превращается из казалось бы безумной идеи во что-то осязаемое и большое. И меня это радует. Вместе с этим проектом расту и я сам. И это крутое ощущение.
Заключение
Спасибо, что уделили время на прочтение данной статьи. Я постарался максимально подробно передать все, что произошло с проектом за последние полгода.
Это не последняя статья, будет еще как минимум две статьи, посвященных данной игре. Это только начало большой истории под названием ALT CITY: Online!
Пишите, о чем хотелось бы вам почитать в будущих статьях. Также буду рад услышать ваши мысли после прочтения данной статьи.
Если вас заинтересовала игра, и вы хотели бы первым узнать о ее релизе, то вы можете вступить в нашу группу Вконтакте, туда я выкладываю новости об игре.
Как писал выше, сейчас я плотно занят набором команды, в первую очередь ищу талантливых программистов, которые умеют и любят выстраивать и прописывать логику, знают основные паттерны проектирования, умеют работать в команде. Любить игры с открытым миром - обязательно. Знание C# очень желательно, но не обязательно. Опыт работы с движком Unity желательно, но не обязательно. Если вы находитесь в Волгограде, и вы уверены, что сможете сделать этот проект лучше - жду ваше резюме по адресу altcityonline@gmail.com. Речь идет о фулл тайм работе в классном офисе в центре города. Наша цель - оперативно и качественно доработать проект до релизного состояния и запуститься в ближайшее время, после чего будем делать много интересных штук для ALT CITY: Online! Будем завоевывать мир вместе.
gerasimoff-malik
Неплохая такая рекламка
pokruchin Автор
Это не реклама, это очень подробный и искренний рассказ о пережитом опыте. В чем реклама?
smi97
Вы к каждому посту о разработке проекта так пишете?:)