Я хочу создать простую многопользовательскую игру клиент-сервер в реальном времени в качестве проекта для моего сетевого класса.
Я много читал о моделях многопользовательских сетей в реальном времени, и я понимаю отношения между клиентом и сервером и методы компенсации лагов.
Я хочу сделать что-то похожее на сетевую модель Quake 3: в основном, сервер хранит снимок всего игрового состояния; после получения входных данных от клиентов сервер создает новый снимок, отражающий изменения. Затем он вычисляет различия между новым снимком и последним и отправляет их клиентам, чтобы они могли синхронизироваться.
Мне кажется, что такой подход действительно надежен - если клиент и сервер имеют стабильное соединение, для синхронизации их будет отправлен только минимально необходимый объем данных. Если клиент не синхронизирован, можно также запросить полный снимок.
Однако я не могу найти хороший способ реализовать систему снимков. Мне действительно трудно отойти от архитектуры программирования для одного игрока и подумать о том, как можно сохранить состояние игры таким образом, чтобы:
- Все данные отделены от логики
- Различия могут быть рассчитаны между снимками состояний игры
- Игровыми сущностями все еще легко манипулировать с помощью кода
Как реализован класс снимка ? Как хранятся сущности и их данные? Каждый ли объект клиента имеет идентификатор, который совпадает с идентификатором на сервере?
Как рассчитываются различия между снимками?
В целом: как будет реализована система снимков состояния игры?