Expand description
Граница клиентского generic-каркаса ↔ игровой предикт (Этап 4b плана
распила, PLAN.md §3.6/§4b). ClientState<G> (этот модуль) владеет сетевым
буфером (Interpolator), очередью событийных кадров и hot-буфером
рендер-тика; конкретная игра (TanksClient и т.п.) реализует
GameClientDef — client-side prediction своего актора, визуальный
спавн эффектов, панель. Форма трейта валидирована фикстурой
(tests в этом модуле, TestClient) до миграции танков — см.
PLAN_4_details.md.
Камера и predicted-хвост hot-буфера разделены: движок пишет камеру как
[f32; 2] (общий для любой игры смысл — «куда смотреть»), а форму
хвоста (набор полей актора) собирает игра — движок дописывает его в
hot-буфер как непрозрачный Vec<f32>, не зная раскладки (см.
RenderOverlay).
Тем же хвостом игра перекрывает и ЧУЖИЕ строки кадра
(GameClientDef::render_rows): предсказанные телом игры сущности —
динамика карты, контактирующие чужие акторы — дописываются записями
после predicted-хвоста, а разбор hot-буфера кладёт запись в
game[key][id], поэтому последняя запись перекрывает интерполированную.
Structs§
- Client
State - Generic оркестрация клиентского ядра поверх игровой
G: GameClientDef: сетевой буфер (interpolator), очередь событийных кадров, hot-буфер рендер-тика. Байтовая раскладка hot-буфера (флаги/камера/N танков×поля/M динамики×поля/predicted-хвост) не меняется — см.write_hot. - Predicted
Row - Строка рендер-тика, которой игра перекрывает интерполированную:
key_id— числовой id ключа снапшот-реестра,id— id строки (gameIdдляIndexed8, индекс дляIndexedNoNull8),fields— поля по схеме этого ключа. Ширину движок приводит к схеме сам: лишние поля отбрасываются, недостающие дописываются нулями, иначе одна кривая запись сдвинула бы разбор всего хвоста. - Render
Overlay - Predicted-запись рендер-тика: камера (общий смысл) + непрозрачный хвост hot-буфера (раскладку полей актора знает только игра).
Traits§
- Game
Client Def - Игровая половина клиентского ядра — зеркало
crate::sim::GameSim<G>на клиентской стороне.ClientState<G>(ниже) зовёт эти методы в фиксированных точках рендер-тика;Selfхранит всё нужное для предикта (модели, оружие, историю ввода) само —ClientState<G>игровых конфигов не хранит.