DOU Проектор: Meduzzza — онлайн игра, созданная по рецепту успеха мобильной казуалки
В рубрике DOU Проектор все желающие могут презентовать свой продукт (как стартап, так и ламповый pet-проект). Если вам есть о чем рассказать — приглашаем поучаствовать. Если нет — возможно, серия вдохновит на создание собственного made in Ukraine продукта. Вопросы и заявки на участие присылайте на Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра. .
Идея
Всем привет! Мы — молодой украинский стартап, состоящий из выпускников КПИ, и хотим рассказать о нашем опыте создания высоконагруженного проекта. Нашей целью было создать онлайн-игру, которая наберет популярность за считанные дни.
Однажды я наткнулся на перечень факторов успешной игры, который и привожу ниже:
— Бесконечный геймплей. Если навык игрока позволяет, то продолжать игру можно бесконечно;
— Один шанс. Если наш навык недостаточно хорош, у нас нет права на ошибку, проиграл — начинай все с самого начала;
— Хардкор. Завышенная сложность геймплея;
— Необычная механика, которая свойственна только этой игре или небольшому количеству игр;
— Отсутствие уровневости, уровни = зло.
Имея ключ к успеху, я заинтересовался, как же это делается? Захотелось понять — и не просто разобраться в архитектуре, а сделать и проверить. Так вот, прошло чуть меньше года, и мы объединили все вышеперечисленные пункты в нашем проекте meduzzza.io
Реализация
Игра заключается в том, что вы погружаетесь в подводный мир медуз и представлены одной из них. Вначале все медузы маленькие, но есть возможность расти, поедая пузырьки или же других игроков. Как и у реальных медуз, хвост — ядовитый, а скорость — обратно пропорциональна размеру. Основная цель игры — завоевать и удержать первенство, владея хорошим навыком.
Как всё работает? На сервере стоит таймер. Каждые n миллисекунд игра делает перемещение объектов на сервере, после — отправляет данные всем подключенным пользователям. От клиентов принимает новый вектор движения и применяет его к конкретному юзеру. И так по кругу.
В разработке мы использовали следующие технологии:
— Back-end: Asp core 1.0 update2, в качестве веб сервера Kerstel;
— Communicatiob: Websocket;
— Front-end: WEB GL (canvas).
Грабли и эволюция бэкенда. Есть масса примеров и документации про Websocket, но особо интересным нам показался SignalR, потому что он делает всю рутинную работу за разработчика — например, выбор транспорта (в приоритете WebSockets, Server-Sent Events, Long Polling, Polling), также для работы с ним есть масса готовых библиотек на разных языках. В общем, огромное спасибо разработчиками Microsoft: Damian Edwards и David Fowler.
Первоночальная версия была написана на ASP.NET 4.6. Но с выходом beta версии ASP Core 1.0 нас впечатлил тот факт, что у новой версии производительность больше в 18 раз. И в 6 раз больше, чем node.js! И мы перешли на новый ASP, отказавшись от IIS, мигрировали на Kerstel. Поскольку официальной поддержки SignalR у ASP Core пока нет, мы используем чистый Websocket, и это работает превосходно.
Как только мы столкнулись с огромным количеством одновременных пользователей, пришло время оптимизации. Основное, на что мы обратили внимание — это время выполнения каждой операции на сервере. Это интервал, за который пользователю необходимо получить новые данные. В нашем проекте игроки получают рассылку каждые 20 ms.
Необходимо:
— Дожидаться окончания отправки каждому подключенному пользователю. А если этого не делать, собирается огромное количество задач, которые используют множество байтов и, в результате, мы получаем out of memory exception;
— Отслеживать наличие пользователя со слабым интернет-соединением, и если отправка занимает более N миллисекунд, отменять ее для данного юзера.
Таким образом, пользователи, которые играют с хорошим соединением, не зависят от других пользователей.
Фронтенд и 3D модель на чистом WEB GL. Главное, на что нам пришлось обратить внимание, это образ нашего главного персонажа игры — медузы. Мы использовали WEB GL, так как по опыту работы на предыдущих проектах с Konva.js (там были memory leak), мы осознали истину: если это должно работать хорошо — это должно написано на самом низкоуровневом подходе.
На WEB GL модель можно посмотреть на русском и на английском.
Что касается дизайна, важно сделать обстановку в игре завораживающей и приятной для глаз. Главное — не переборщить с количеством цветов и их яркостью. А вообще важно привлечь к сотрудничеству дизайнеров — они-то в этом разбираются.
Такие плюшки, как покемоны. Мы решили порадовать наших пользователей покемонами. Ведь они стали мейнстримом, но не все решаются играть в оригинальную версию игры из-за многочисленных прецедентов. Для наших же игроков это совершенно безопасно, а тот, кто находит покемона, получает приятный бонус.
Результаты
С момента запуска meduzzza.io прошло 6 недель, и уже сейчас статистика такова:
— 51 тысяча уникальных посетителей;
— 180 тысяч сыгранных партий;
— 15 минут — средняя продолжительность игровой сессии.
Статистика посещаемости на данный момент:
На своем опыте мы удостоверились, что:
— .NET очень хорошо подходит для стартапа;
— ASP Core 1.0 заслуживает огромного внимания и открывает нереальные возможности в производительности для высоконагруженных проектов.
Спасибо за интерес! Надеемся услышать ваши отзывы о проекте и статье.