Lab · потрогать руками
Симулятор лага и предсказания
Один и тот же аватар, один и тот же пинг — но три модели нетокода прячут задержку по-разному. Серое кольцо — где ты на самом деле жмёшь (нулевая задержка). Цветной кружок — что показывает выбранная модель. Смотри на зазор между ними: наивный отстаёт на весь RTT, предсказание держится рядом (но дёргается при потерях), локстеп отстаёт ровно и без рывков (но замерзает при потерях).
Как пользоваться
Аватар сам ходит влево-вправо (или жми ◀ ▶, выключив «авто»). Выбери модель вверху. Подними пинг — у «наивного» зазор растёт на весь RTT, у «предсказания» аватар остаётся под кольцом, у «локстепа» появляется ровный отступ (input delay). Подними потери пакетов — «предсказание» начнёт дёргаться (rubber-band: сервер и клиент разошлись), «локстеп» начнёт замерзать (ждём ретрансмита ввода), «наивный» — и лаг, и рывки.
где жмёшь (0 мс)
что показывает модель
сервер (авторитет)
Что заметить: 1) при потерях 0% переключи «наивный» → «предсказание» на одном пинге: зазор с кольцом исчезает (свой ввод применяется сразу), но это не магия — цена в п.3. 2) «локстеп»: зазор возвращается, но ровный и без рывков — это input delay, и его чувствуешь всегда. 3) подними потери до 15–25%: «предсказание» дёргается (rubber-band — сервер пропустил часть ввода), «локстеп» замирает рывками (вся симуляция ждёт ввод), «наивный» совмещает лаг и рывки.
🏠 Что дальше
Вернись в урок — таблицу «три модели рядом» и блок «🔧 Запусти и поковыряй»: подними реальный сетевой сэмпл в Godot (MultiplayerSynchronizer) и роллбэк-плагин (GGRS), включи искусственный лаг — и увидишь те же три сигнатуры на настоящем движке. Третью модель вглубь — в уроке роллбэк (GGPO).
Связи
из урока
Таксономия нетокода — теория трёх моделей: что кладём на провод (состояние/команды/ввод), стоимость канала и стоимость задержки.
пример
Клиент-предсказание — первая модель вглубь: prediction + reconciliation + lag-comp в QuakeWorld/Source.
Что заметить по итогу (чеклист наблюдений)
- На пинге 300 мс «наивный» отстаёт на ~300 мс (весь RTT), «предсказание» — ~0, «локстеп» — на фиксированный input delay (~one-way).
- Потери 0% → «предсказание» гладкое и без лага; вот цена «бесплатного» отклика — она вылезает только при рассинхроне.
- Потери 20% → «предсказание» = rubber-band (счётчик коррекций растёт), «локстеп» = заморозки (счётчик секунд растёт), «наивный» = и то, и другое.
- Ниже тикрейт (10 Гц) → «наивный» становится ещё и «ступенчатым» (редкие снапшоты), у предсказания свой ввод всё равно гладкий.