главная / блог / сеть
Опубликовано: 11 марта 2026 г. 13 мин чтения сеть
Самый простой способ объяснить клиентское предсказание

Самый простой способ объяснить клиентское предсказание

Мультиплеерное движение выглядит сложным. На деле это три шага: предсказать, сравнить, исправить.

Зачем это нужно

Без серверного авторитета читерство не остановить. Но если отправлять каждый ввод на сервер и ждать ответ, игрок увидит персонажа, который двигается через 80 мс после нажатия. В это невозможно играть.

Решение: клиент применяет движение локально сразу же и одновременно отправляет ввод на сервер. То есть он предсказывает будущее.

Три шага

Предсказание: клиент мгновенно симулирует ввод и записывает результат в буфер истории с номером тика.

Сравнение: когда сервер присылает свой результат, клиент сравнивает его с тем, что сохранил для этого тика.

Исправление: если расхождение в пределах допуска, ничего не делаем. Иначе ставим позицию сервера и заново проигрываем весь ввод с этого тика.

Ловушки на практике

Симуляция обязана быть детерминированной. Один и тот же ввод из одного и того же состояния должен давать один и тот же результат. Шаг физики на Time.deltaTime это ломает — используйте фиксированный тик.

Не исправляйте резко. Сглаживание мелких расхождений на протяжении нескольких кадров избавляет игрока от ощущения телепорта.

Reconciliation.cs
void OnServerState(ServerState s) { _history.DiscardBefore(s.Tick); if (Vector3.Distance(s.Position, _history[s.Tick].Position) < TOLERANCE) return; // tahmin dogru, dokunma transform.position = s.Position; // duzelt for (int t = s.Tick + 1; t <= _localTick; t++) Simulate(_history[t].Input); // ve yeniden oyna }
csharpReconciliation.cs

С чего начать

Сначала постройте одиночное движение на фиксированном тике и сделайте его детерминированным. Сетевой слой добавляется потом.

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

← Все статьи