Мы создаем многопользовательскую игру в реальном времени, в которой каждый игрок должен сообщать о своем состоянии на каждой итерации игрового цикла.
Обновления состояния передаются с использованием ненадежного UDP .
Чтобы минимизировать отправку данных о состоянии, мы создали систему, которая будет отправлять только дельты (независимо от того, какие данные о состоянии были изменены).
Этот метод, однако, имеет недостатки, так как потерянный пакет будет означать, что другие игроки не получат дельту, что заставит игру вести себя неожиданным образом.
Например:
Предположим, что состояние состоит из: {positionX, positionY, health}
Frame 1 - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.
// Другие игроки не знают об изменении здоровья.
Как можно решить эту проблему? отправка всей информации не всегда возможна.
источник
Вы также можете обойти эту проблему, отправляя клиентам полное обновление состояния, скажем, каждую секунду. Если клиент не получил пакет, он будет вести себя некорректно, пока не получит полное обновление состояния. Тогда это будет синхронизировано снова.
источник
Многие игры используют как UDP, так и TCP / IP для отправки / получения данных, и в зависимости от того, как часто данные отправляются, используется другой протокол.
Например:
UDP: позиционные обновления и все остальное, что потенциально может быть отправлено / получено несколько раз в секунду.
TCP / IP: действия инвентаря, действия заклинания / способности, (большинство действий, выполненных пользователем)
Это действительно зависит от количества трафика каждого элемента. Если вы обнаружите, что отправляете обновления HP довольно часто, возможно, они должны быть по UDP.
источник
Если вы читаете обзор исходного кода Quake 3 , он объясняет сетевую модель, которая очень похожа на ваш дизайн, но предлагает решение для отброшенных пакетов.
По сути, в вашей модели вы отправляете дельты против непосредственно предыдущего состояния. В модели quake3 вы отправляете дельты относительно последнего подтвержденного состояния от партнера.
источник