История создания карты мира для игры “C&C Tiberium Alliances”. Постмортем

в 6:15, , рубрики: game development, html5 canvas, php, zeromq, Веб-разработка, метки: , ,

Всем привет! В этом посте хотел бы поделиться опытом создания и развития сервиса для одной небезызвестной онлайн игры.
История создания карты мира для игры “C&C Tiberium Alliances”. Постмортем
Жизнь в нем еще пока теплится, но, думаю, уже можно подвести окончательные итоги.

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

Первый вопрос, который встал “где я?”. Следуя канонам жанра, я предположил, что мне надо построить радар. Но его почему-то не было. Далее я с удивлением обнаружил, что в игре вообще не предусмотрена миникарта. Что было весьма странно, учитывая гигантское игровое пространство. К тому же, как потом выяснилось, в ближайшие планы разработчиков ее создание не входило.

Немного поизучав серверное API, нашел откуда брать нужные мне данные — списки пользователей с их базами. За пару часов я написал парсер на php. Затруднения возникли только с авторизацией. Она была двухуровневая, с хешами и своими заголовками, но и она поддалась. Слепил на коленке страничку, где просто расставил имена игроков абсолютным позиционированием, залил на бесплатный хостинг. Поиск по карте осуществлялся средствами браузера “ctrl+f”, ровно как и масштабирование карты через “ctrl+mousewheel”. Этим творением я поделился со своим кланом. Оказалось, что карты не хватало не только мне. Увидев ее, соклановцы очень обрадовались, а руководство клана “приказало” не распространяться о карте за пределами клана.

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

Сначала я попытался заменить имена игроков на маркеры из html тэгов, но выглядело это все жутко при масштабировании. Вторая попытка — была использовать svg, но производительность оставляла желать лучшего. Оставался только канвас, и вот тут все зашуршало уже гораздо быстрее.

Первый релиз на канвасе выглядел так:
История создания карты мира для игры “C&C Tiberium Alliances”. Постмортем

После внедрения еще парочки фич, количество посещений моего ресурса достигло десяти тысяч в день. Вместе с ростом количества пользователей, в игре открывали все больше и больше игровых серверов. В тот момент один сервер (игровой мир) парсился приблизительно час. Получалось, что с ростом их количества, карта каждого отдельного сервера обновлялась все реже и реже. Актуальность данных быстро падала, пользователи начали жаловаться.

Внедрение curl multisocket хоть и сократило время парсинга одного мира вдвое, но окончательно решить проблему не могло. На мою удачу, мне в личку отписался один из разработчиков. Указав на функции в коде, которые отвечали за работу с протоколом передачи данных, созданием запросов и разбора информации для отрисовки внутриигрового ландшафта. После нескольких экспериментов по минимизации количества запросов, время парсинга одного сервера сократилось до 6 минут.

Окрыленный такой удачей, я с удвоенным усердием начал пилить новые фичи. Добавил возможности рисовать тактические маневры на карте и делиться ими, полностью менять менять цветовую схему и кастомизировать значки. И опять все уперлось в парсер, когда количество миров подобралось к отметке 100.
История создания карты мира для игры “C&C Tiberium Alliances”. Постмортем

Решено было переписать backend полностью. За основу был взят ZeroMQ, появились менеджеры авторизации, парсинга, аплоада, соответственно набор воркеров для них + система мониторинга этой радости. Остался вопрос где это все захостить. Для нормальной производительности проекта, затраты на хостинг были бы просто космическими. Поиск сервера в игровом комьюнити не дал желаемых результатов. Решил вопрос купив домой новое железо с аппаратной поддержкой виртуализации. Тем более давно хотел с этим поковыряться. Одну виртуалку сделал себе, пробросив туда видюху и часть юсб портов. На остальных поднял систему, причем часть виртуалок была linux, часть windows. В связи с особенностями реализации биндинга 0mq. Также были проблемы аптайма сервиса, все же не tier 4 :), но сменив провайдера все стабилизировалось. Разогретый парсер с новым железом справлялся с сотней миров за пару минут.

Карта приняла такой вид:
История создания карты мира для игры “C&C Tiberium Alliances”. Постмортем

Параллельно с этим я начал разработку клиента под андроид. Взял свое php API, портировал на джаву и расширил его, реализовал базовый функционал. Примерно в это же время к разработке захотел подключиться кодер из Чикаго, чему я был немало удивлен. На его плечи легла задача реализовать е-mail уведомление игрока об атаке или уничтожении его базы. Коллега на C# написал сабскрайбер к парсеру, который отслеживал все базы всех игроков на всех мирах.

Но все в один миг прекратилось. Мой “инсайдер” рассказал, что ЕА посчитало проект убыточным. Их команду расформировали и раскидали по другим проектам. Разработку игры заморозили. Соответственно развитие клиента и сервиса также перестало быть целесообразным для мертвого проекта, и я поставил на них точку.

В данный момент посещаемость моей карты 2.5 тысячи человек. Доходы от рекламы с июля 2012 года составили 5 тысяч баксов. Донат меньше 200.

P.S. Пока писал статью hetzner вдруг обиделся, что я им с одного IP делаю 100кк пост запросов с сутки и заливаю 5тб трафа в месяц.

Либу, которую написал для работы с 0mq, можно посмотреть тут https://github.com/limitium/0MQ, если кого-то заинтересует, то оформлю ридми и сделаю пакет для композера. Ничего не течет, пашет 24/7 уже 2 года.
Морду проекта можно посмотреть тут github.com/limitium/C-CTA-map-frontend интересное только рендер карты.

Автор: limitium

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js