Python conf in Kharkiv, Nov 16 with Intel, Elastic engineering leaders. Prices go up 21.10

DOU Проектор: Meduzzza — онлайн игра, созданная по рецепту успеха мобильной казуалки

В рубрике DOU Проектор все желающие могут презентовать свой продукт (как стартап, так и ламповый pet-проект). Если вам есть о чем рассказать — приглашаем поучаствовать. Если нет — возможно, серия вдохновит на создание собственного made in Ukraine продукта. Вопросы и заявки на участие присылайте на editors@dou.ua.

Идея

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

Однажды я наткнулся на перечень факторов успешной игры, который и привожу ниже:

— Бесконечный геймплей. Если навык игрока позволяет, то продолжать игру можно бесконечно;
— Один шанс. Если наш навык недостаточно хорош, у нас нет права на ошибку, проиграл — начинай все с самого начала;
— Хардкор. Завышенная сложность геймплея;
— Необычная механика, которая свойственна только этой игре или небольшому количеству игр;
— Отсутствие уровневости, уровни = зло.

Имея ключ к успеху, я заинтересовался, как же это делается? Захотелось понять — и не просто разобраться в архитектуре, а сделать и проверить. Так вот, прошло чуть меньше года, и мы объединили все вышеперечисленные пункты в нашем проекте 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 заслуживает огромного внимания и открывает нереальные возможности в производительности для высоконагруженных проектов.

Спасибо за интерес! Надеемся услышать ваши отзывы о проекте и статье.

LinkedIn

36 комментариев

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

Похоже ссылка на meduzzza.io уже не работает и сам проект заброшен

Ссылка на сайт рандомно перекидывает на инетмагазины.

— Дожидаться окончания отправки каждому подключенному пользователю. А если этого не делать, собирается огромное количество задач, которые используют множество байтов и, в результате, мы получаем out of memory exception;
— Отслеживать наличие пользователя со слабым интернет-соединением, и если отправка занимает более N миллисекунд, отменять ее для данного юзера.
А зачем вы ждете ответ от клиента? Я думал, что сервер должна интересовать только информация об изменении вектора движения и неважно, получил ли клиент апдейт состояния игры или нет — это проблемы клиента.

И какие задачи накапливаются если не дожидаться окончания отправки?

А что у вас с задержкой между игроками из разных регионов? Как вы ее минимизировали?

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

Браузер попросил включить flash для игры. Серьезно?

Я не знаю, что у Вас за браузер и почему просит включить, наша игра не использует флеш)

Действительно странно, сейчас не просит. Может тестировали какую-то монетизацию, был flash экран как плеера, т.е. не занимал всю страницу.

Крутая игра! Молодцы! Намного красивее и интереснее аналогов, ИМХО. Самое то, чтобы скоротать время в ожидании опаздывающих на митинг))))

Как планируете развивать и усовершенствовать сервис в плане технологий?

Привет, хороший вопрос)
На данный момент планируем переставить сервера на linux, а там дальше видно будет))

Є певні гальма з графікою (Firefox 48, Ubuntu 14.04, відеоядро з Core i7 3770). Точніше, рух медузи то занадто швидкий і уривчастий, то вона на секунду перестає реагувати на мишку. Один раз була зовсім дивна штука: медуза зупинилася і секунд 10 не реагувала, а коли прокинулася, то була на тому самому місці (хоча застрягла в процесі руху).
І часом бульбашки не з’їдаються, медуза просто пропливає поверх них, ніби їх там нема.

Здравствуйте, спасибо огромное за Ваш комментарий,
мы воссоздадим ситуацию в данных условиях, и все выясним)

тачпадом играть не очень удобно

Молодцы. Механика явно из agar.io, slither.io, diep.io, но ничего плохого в этом нет. Я не понял лишь :

С момента запуска meduzzza.io прошло 6 недель, и уже сейчас статистика такова:
— 51 тысяча уникальных посетителей;
— 180 тысяч сыгранных партий;
— 15 минут — средняя продолжительность игровой сессии.

как это связано с

с огромным количеством одновременных пользователей, пришло время оптимизации.

Сколько одновременных игроков в среднем на сервере? Вы в одном потоке обрабатываете события игровой комнаты? Сокеты блокирующие? Какой request-rate?

Да, привет,
мы собрали фукус группу 150 человек и начали проверять производительность.
Это и было связано

с огромным количеством одновременных пользователей, пришло время оптимизации.

На каждом сервере от 10 до 25 игроков, + это зависит от времени суток в конкретном регионе).
События комнаты обрабатываются в одном потоке,
Сокеты не блокирующие.
Request-rate : клиенты получают данные от сервера 40 раз в секунду, и отправляют с такой же частотой.

Спасибо и удачи. И рекомендую начать зарабатывать как можно быстрее.

Хороший результат за год. Классно, что на старте есть достаточное количество живых пользователей. Подтолкнет развиваться. Удачи!

Спасибо огромное за поддержку.
Это результаты даже не за года, а за 6 недель ;)

Я имел ввиду разработку. Около года работали над игрой?

Как привлекали игроков? Сколько пришло в первую неделю, какой был рост? Получается ли органически расти?

За первую неделю пришло около тысячи. По началу во основном через соц сети.
www.vodainfo.com/ru/5638.html
А после того как известный видео-блогер на ютубе сделал обзор нашей игры
то был огромный рост посещаемости, тысячи комментарий)
Да, сейчас получается расти органически, сарафанное радио)

но это ведь копия slither.io

Антон, присмотритесь... Вы, кажется, попутали

Швидше agar.io. А ще раніше був Osmos (www.osmos-game.com), але й він, здається, був не першою грою з такою концепцією.

але й він, здається, був не першою грою з такою концепцією.

До осмоса були флешки в браузерах від різних студій і інді девів. Що було до них не знаю :).
Але всі ці ігри були з ботами, онлайн вивів їх на новий рівень.

а чего не написали про кол-во заработанного бабла? — это же главный показатель успеха
или монетизации.нет?

Привет, мы запустились меньше двух месяцев назад, и решили не делать монетизацию со старта проекта)

Это и есть стимул к развитию ))) а вообще, приходится инвестировать поначалу, конечто же)

А игра и не взлетит, нет ничего крутого в ней. Собственно ваша статистика это подтверждает.

Подписаться на комментарии