Перейти к основному содержимому
Живая игра

Эта страница ещё не переведена — показана английская версия.

Предсказание своего движения

Вы действуете по своему вводу, не дожидаясь ответа сервера, а там, где вы с сервером разошлись, клиент поправляет себя сам. Ошибка здесь стоит небольшой визуальной коррекции, и только. Поэтому из трёх механизмов предсказания только здесь можно действовать смело.

Предсказание переигрывает объявленные правила, а не дублирует их

Параллельной реализации вашего движения на клиенте нет. Клиент выполняет ту же объявленную модель, что и платформа: модель принадлежит модулю Locomotion, а предсказание (prediction) лишь применяет её раньше. Поэтому стороны почти всегда сходятся: правила одни, просто применяются дважды.

Вызывать операцию «предсказать» не нужно, операцию «поправить» — тоже. Предсказание работает потому, что аспект объявлен предсказуемым.

Что предсказывается, объявляется для каждого аспекта

Предсказуемость — это объявление на аспекте сущности, а не глобальный переключатель:

  • Аспект, который клиент может вычислить сам, — например, позицию под вашим собственным вводом, — предсказывать можно.
  • Аспект, который авторитетная сторона меняет по правилам, неизвестным клиенту, предсказывать нельзя. Если клиент не может его вывести, догадка приведёт к откату, и игрок (player) воспримет его как обман со стороны игры.

Протокол коррекции и два числа, которые его определяют

your machinethe server input applied at once, locally — the declared rules, run earlythe same inputthe same rules, laterthey agree — nothing happens, and you never knewthey disagree — your client is moved to the server
Ваш ввод сразу применяется локально, позже те же правила выполняются на сервере, и клиент поправляется только там, где результаты разошлись

Авторитетное состояние приходит вместе с номером последнего применённого ввода, поэтому клиент точно знает, какая часть его буфера ещё не подтверждена. Дальше клиент:

  1. Принимает авторитетное состояние.
  2. Переигрывает из буфера весь ввод, который шёл после подтверждённого.
  3. Проводит реконсиляцию: сводит результат с тем, что уже показывал.

Как это ощущается, решают два объявленных числа. Первое — порог расхождения: ниже него коррекция сглаживается, выше — клиент перескакивает в авторитетное состояние и переигрывает ввод. Второе — размер буфера неподтверждённого ввода. Переполнение здесь не приводит к неопределённому поведению: деградация объявлена и наблюдаема. Клиент с плохим соединением знает, что перестал предсказывать, и не уплывает незаметно.

Расхождение видит только тот клиент, у которого оно случилось. Вы можете узнать, что ваше предсказание поправили и насколько. Это полезно для настройки и для честного индикатора соединения у игрока. Чужое расхождение прочитать нельзя: размер ошибки предсказания — это информация о чужом соединении, а не об игре. Коррекция выполняется на клиенте, потому что состояние авторитетной стороны все остальные и так уже видели.

Если вы раньше работали с другими решениями

  • Mover 2.0 в Unreal. Устройство знакомое: ввод с метками тиков, модель движения, коррекции от авторитетной стороны. Разница в том, где живёт модель. Здесь вы её объявляете, а симулирует её платформа, так что компонента движения, от которого нужно наследоваться или который нужно заменить, у нас нет.
  • Неткод с откатом и переигрыванием, как в Photon Fusion. Переигрывание своего неподтверждённого ввода после коррекции — тот же механизм, и здесь он есть полностью. Чего здесь намеренно нет, так это повторного прогона мира задним числом. Что происходит вместо этого и почему, описано на странице Lag Compensation.

Что здесь не описано

Сущности (entity) других игроков не предсказываются, а отображаются — об этом страница Как показывать других игроков. Оценка выстрела по тому, что видел стрелок, — серверный механизм, он описан на странице Lag Compensation. И ни один из трёх механизмов не работает, если комната (room) работает в режиме внешнего авторитетного источника: тогда тик принадлежит тому, кто его выполняет, и предсказание — тоже.