Простейшая реализации кросс-платформенного мультиплеера на примере эволюции одной .NET игры

в 18:42, , рубрики: game development, websockets, Windows 8, windows phone, игра, Песочница, разработка под windows phone, метки: , , ,

Всем привет!
Сразу попрошу извинения за стилистику моей писанины и незнание русского языка – к сожалению я ни разу не блогописатель, но желание оставлять комменты на хабре — сильный мотиватор. Кроме того, что я не писатель, я еще и не программист, а инженер-строитель, который иногда балуется написанием пары строк кода – такое вот хобби среди прочих. Но про строительство я вдоволь написался во времена подготовки и защиты диссера, и больше к этому возвращаться желания нет.
А в этой статье я хочу описать личный опыт создания одной игрушки с реализацией многопользовательской игры, позволяющей поддерживать различные платформы (пишу я на .NET, поэтому в первую очередь мой опыт касается Windows/WP, но этот же метод прекрасно подойдет для других платформ, у меня есть рабочие прототипы описываемой игры для Android/iOS, но пока нет желания платить по 1к юсд за коммерческие пакеты Xamarin). И да — в этой вводной статье (которая изначально планировалась исключительно в песочницу) я не буду раскрывать технических деталей, так как в этом случае я рискую еще долго ее не закончить. Кто знает, возможно у меня еще появится время и возможность написать более подробное продолжение.

Для начала немного истории. Все началось в далеком 2005(4?, 6?) году, когда я в компании друзей моей жены сыграл в «книффель» — игру в кости, которая мне так понравилась, что я захотел непременно сделать свою компьютерную реализацию. В те времена я неплохо знал VB.NET и делал свои первые шаги в C#, поэтому первая версия была готова уже на следующий день.

image
«Книффель» — первая версия

Я конечно понимал, что это «тихий ужас» и поэтому продолжил совершенствоваться и пошел читать умные книжки. В одной из них я почерпнул идею контролла для игры в кости, который и лег в основу всех моих последующих «книффелей». Помню, вторая версия игры некоторое время была очень успешна у меня на работе – бывало даже задерживались, чтобы побросать компьютерные кости. Та Windows Forms игра давно заброшена и я даже не знаю где исходники, но она до сих пор доступна для закачки на некоторых сайтах.

image
«Книффель» — вторая версия

Продолжение история получила в 2010 году, когда освоив Silverlight, я решил сделать из «книффеля» приложение для вконтакте. Но, конечно, же играть в сети на одном компьютере не вариант, тогда я столкнулся впервые с необходимостью реализации сетевой игры. Основная проблема в том, что стандартная схема http запрос-ответ здесь не применима, так как серверу необходимо информировать о состоянии игры несколько клиентов. К счастью, в Silverlight для решения этой задачи есть вариант почти из «коробки» и называется он Duplex WCF сервис. Реализовав клиент-серверные коммуникации посредством дуплекс сервиса, я получил довольно стабильную игру, но только на время…

image
«Книффель» — третья версия, онлайн игра вконтакте

Слабым местом системы была серверная часть, которую я разместил на общем хостинге, где моему сайту было доступно что-то около 5% процессорного времени не самого сильного процессора. Игра многим людям понравилась и набрала некоторую популярность, а вместе с ней увеличилось и количество пользователей, находящихся одновременно онлайн. Сервер стал попросту сбрасывать сессии, игра стала обрываться, зависать. Играть стало невозможно. Тогда я не знал как решить эту проблему и поэтому решил просто “забить”…
Ну а в прошлом году, я наконец-таки “улетел в облака”. Делая несколько проектов с использованием AWS и Windows Azure, я подумал, что это может быть отличным решением для реанимации книффеля.
Примерно в то-же время моя жена стала обладательницей Windows Phone телефона, а я стал “в восторге от него”. Мне очень понравилась вся концепция системы, так что я купил виндовс фон и себе и стал портировать книффель на него, а заодно и на Windows 8 – благо в WP тот же Silverlight, а в WinRT тоже XAML/С#. Так что с использованием MVVM паттерна и сравнительно небольшими трудозатратами я получил три приложения — для Windows Phone, Windows 8 и (переписал) Сильверлайт. В приложениях 95% кода в общих сs файлах с за#ifаными специфическими моментами. Очень удобно при юнит тестировании и поддержке – достаточно поменять что-то лишь в одном проекте и просто убедиться, что работают все. Проблема оставалась лишь в сетевой игре – использовать мой дуплекс сервис было невозможно на всех платформах, особенно с учетом потенциального расширения до iOS и Андроида. Решение мне было нужно универсальное, чтобы оно вписывалось в мою концепцию “общего кода для всех платформ”.
Такое решение нашлось – WebSockets. Веб сокеты нативно поддерживаются .NET 4.5, так что с реализацией в серверной части и для Windows 8 проблем не было. А для Silverlight’a и Windows Phone’a я нашел реализацию в виде опенсорс библиотеки WebSocket4Net. Эта же библиотека есть для Monotouch и Mono для Android. C Html/JS все так же просто: я успешно тестировал коммуникацию с моим сервером с простейшей вебстранички.
Ну а сервер — в Windows Azure. Работает это все неплохо – можно отлично играть одновременно со всех поддерживаемых платформ, косяки конечно есть, но как же без них…

image
«Книффель» (точнее уже «Магический Yatzy») — текущая версия, многопользовательская игра между Windows 8, Windows RT, WP7 и WP8

Вот такая получилась «песочницкая» статейка – во многом автобиографическая и местами, возможно, бестолковая… ну как умею.

PS. После публикации игры на международной арене и претензий со стороны немецкого правообладателя, мне пришлось отказаться от названия “книффель” и перейти на более нейтральное «международное непатентованное название «Yatzy»», к делу это отношения не имеет, но все же…

Автор: antonby

Источник


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


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