После успешной оптимизации клиентской части и серверной архитектуры пришла пора писать механики самой игры для взаимодействия по API - я называю их событиями (они вешаются на какой либо игровой объект на сервере, помещаются в очередь и срабатывают когда придет их время).
Суть работы взаимодействия авторитарного сервера и клиентской части следующая:
Мы создаем группу в которой будут собраны некие игровые механики (например идти в указанную точку , идти в указанном направлении, идти за указанным объектом)
Мы указываем таймаут вызова механик этой группы в секундах или в виде кода по результатам которого будет выдано число с плавающей точкой (например пауза между движениями
1 / скорость * магнитуду направлении
, но она может быть и 0 - например на механику получения урона)Мы указываем может ли игрок вызвать механику напрямую (если нет - ее можно будет вызвать лишь из другой механик, например вызов механики получения урона при атаке )
Мы можем указать какие дополнительные параметры могут быть при вызове механики (например объем регенерации жизней или объем урона)
Мы указываем нужно ли рассылать пакет с данными когда механика будет применятся на каком либо существе (например можно высылать время таймаута, доп параметры механики такие как объем урона)
И наконец мы указываем сам код механики который манипулирует параметрами объекта на котором механика сработала и теми объектами которые на карте
Дополнительно можно указать - нужно ли вешать событие на то же существо когда оно отработает (например регенерацию - нужно)
Таким образом можно создать множество механик которые могут быть вызваны через отправку пакета по Websocket соединению со стороны клиента , а так же вызваны по цепочки внутри друг друга. Плюс ко всему мы можем менять код их работы не меняя ничего в клиенте (если это не затрагивает какую то визуальную часть которая еще не реализована)
При замерах скорости работы на VPS с 2мя ядрами процессора и 4GB оперативной памяти результаты стремятся к 1.000.000 RPS и это только на CPU (в будущем я планирую внедрить параллельные вычисления на GPU), хотя имеются и долгие механики такие как:
сохранение в БД игрока (несмотря на то что оно уже асинхронно делается)
расчет поиска пути при движении до точки
В предыдущей статья я рассказал о горизонтальном масштабировании игрового сервера , так что при достижении работы с сервера к 60FPS (на примере выше он 1000FPS) можно переложить вычисления части открытого мира на другое железо (об открытом бесшовном мире я расскажу в следующих статьях которые вы сможете найти в моей профиле)
В заключение я подготовил пару коротких и не только видео с демонстрацией кода и работы игровых механик проекта (доступен демо доступ на сайте http://my-fantasy.ru/). Впереди еще долгий путь в котором надо будет разрабатывать механики для MMO RPG связанные с физикой