Как я написал библиотеку для многопользовательских игр на nodejs

Всем привет! Меня зовут Дамир. Я хотел бы рассказать о своем опыте использования библиотеки colyseus.io и что побудило меня к созданию своих собственных библиотек. Не так давно я опубликовал mosx и magx на github.


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


Поэтому мои первые шаги были в написании игровой логики и сервера. В качестве технологического стека я выбрал nodejs + express + socket.io. Достаточно быстро я понял, что вся логика должна строиться от данных (т.е. от состояния игры) и необходим механизм синхронизации этого состояния с клиентами. Тогда я открыл для себя colyseus.io — фреймворк, который как мне казалось, решал мою задачу на 100%. В нем можно было описать состояние игры, и в нем уже реализована синхронизация состояния с клиентами.


Во время разработки сервера на colyseus я осознал, что реализация меня не очень устраивает:


  1. На тот момент не было лобби комнаты (в текущей версии она появилась), и список доступных комнат приходилось получать, непрерывно опрашивая сервер.
  2. Описывая состояние, можно было указать, какие данные должны синхронизироваться со всеми клиентами, а какие не должны синхронизироваться вообще. При этом не было возможности описать приватные данные, которые должны синхронизироваться только с одним клиентом. Их нужно было передавать сообщением каждому клиенту. В текущей версии появились фильтры, но разработчик не рекомендует ими пользоваться, т.к. они сильно снижают производительность сервера.
  3. Синхронизация не работала с вычисляемыми данными состояния, только со статическими.
  4. Не поддерживалось динамическое изменение схемы состояния — добавление или удаление какого-либо свойства.

    В принципе со всеми этими недочетами можно было смириться, и я даже реализовал на этом фреймворке сервер для игры. Но после реализации фронтэнда, я осознал, что и в клиенте colyseus.js меня не все устраивает:


    Для web клиента я использовал фреймворк Vue.js. Мне не удалось прикрутить состояние комнаты Colyseus.js к Vue, и поэтому пришлось использовать Vuex и перегонять в него все изменения состояния, т.е. на клиенте у меня хранилось состояние в 2-х экземплярах.
    АPI между сервером и клиентом не документирован, поэтому написать свой клиент, который бы сразу сохранял все изменения в vuex было очень трудоемкой задачей.
Tags:
magx, mosx, nodejs, multiplayer, framework, websockets, networking

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.

Similar posts