Expand description
Движковые клиентские примитивы: snapshot-интерполяция (schema-driven),
бинарный декодер кадра v3 (framing), 2D raycast, примитивы столкновений
(SAT-контакты + импульсный решатель) и generic-оркестрация
рендер-тика (game::ClientState<G>) поверх игровой предикт-логики
(game::GameClientDef, реализует конкретная игра — см.
games/tanks/core/src/client/mod.rs).
Modules§
- collision
- 2D-примитивы столкновений для клиентского предсказания — порт
src/lib/collision.js (срез tank-battle 2026-08): «угол объекта» → центр,
OBB против OBB (SAT), сбор контактов OBB с тайловой сеткой стен.
Геометрия берётся тем же
Box2и той же тайловой сеткой, что иclient::raycast, — предсказание движения и предсказание выстрела обязаны видеть карту одинаково. Разрешение собранных контактов — вclient::rigid_body. - divergence
- Детектор рассинхрона предикта (
plan/done/ai-debug/stage_5.md): сравнение предсказанного состояния своего актора с авторитетным player-блоком кадра — покомпонентно, с порогами из конфига. - game
- Граница клиентского generic-каркаса ↔ игровой предикт (Этап 4b плана
распила, PLAN.md §3.6/§4b).
ClientState<G>(этот модуль) владеет сетевым буфером (Interpolator), очередью событийных кадров и hot-буфером рендер-тика; конкретная игра (TanksClientи т.п.) реализуетGameClientDef— client-side prediction своего актора, визуальный спавн эффектов, панель. Форма трейта валидирована фикстурой (testsв этом модуле,TestClient) до миграции танков — см. PLAN_4_details.md. - interpolator
- Snapshot-интерполяция — порт src/client/SnapshotInterpolator.js (срез 2.6). Кадры складываются в буфер по seq с дедупликацией, мир рендерится в прошлом (renderTime = serverNow − delay); события опоздавших кадров выдаются немедленно следующим sample().
- raycast
- 2D raycast-примитивы для клиентского предсказания выстрелов — порт src/lib/raycast.js (срез 2.6): приближённая реплика авторитетного world.cast_ray по данным, которые уже есть у клиента (тайловая сетка стен, прямоугольники динамики карты и танков).
- rigid_
body - Минимальный двухтельный решатель контактов (sequential impulse) для клиентского предсказания — порт src/lib/rigidBody.js (срез tank-battle 2026-08): предсказанный актор, динамика карты и стены живут в одной симуляции, поэтому нарисованные тела не выдавливают друг друга. Это приближение Rapier, а не его копия: остаток расхождения прячет реконсиляция игрового предиктора.
- unpack
- Декодер бинарного кадра v5 — порт unpackFrame из src/lib/snapshotCodec.js (срез 2.6). Раскладка зеркальна упаковке core/src/snapshot.rs (big-endian); float снапшота восстанавливаются повторным округлением до 2 знаков (round2), player-блок читается без округления (точность нужна предикту).