Обычной практикой является использование RUDP (надежный UDP). Он добавляет надежный механизм поверх UDP, обеспечивающий гораздо меньшую задержку, чем TCP, и гарантирующий точность.
На приведенной ниже диаграмме показано, как надежная доставка данных реализуется в онлайн-играх для получения в конечном итоге синхронизированных состояний.
Предположим, в симуляторе шутера происходит большая драка. Символы A, B и C последовательно открывают огонь. Как игровой сервер передает состояния с игрового сервера на игровой клиент?
- Шаги 1 и 2 — Персонаж А открывает огонь. Пакет (packet 0) отправляется клиенту. Клиент подтверждает сервер.
- Шаг 3 — Персонаж B открывает огонь. Пакет теряется во время передачи.
- Шаги 4 и 5 — Персонаж C открывает огонь. Пакет (пакет 2) отправляется клиенту. Поскольку последним успешно доставленным пакетом является пакет 0, клиент знает, что пакет 1 потерян, поэтому пакет 2 буферизуется на стороне клиента. Клиент подтверждает серверу получение пакета 2.
- Шаги 6 и 7 — Сервер некоторое время не получает ack для пакета 1, поэтому он повторно отправляет пакет 1. Когда клиент получает пакет 1, все последующие пакеты вступают в силу, поэтому пакеты 1 и 2 становятся “доставленными”. Затем клиент подтверждает серверу получение пакета 1. На данный момент никакие пакеты не буферизуются.