[bug] Offline-экспорт оставляет воду и ветер на wall clock: анимация зависит от скорости рендера #80

Closed
opened 2026-10-30 09:56:25 +00:00 by chexit · 1 comment
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Ревью 76f680eba64b64eb28435e71ce9f22a84b0e5da1 (после 6f3fc64). Контракт capture API из патча 32 обещает фиксированное 1/fps время кадра независимо от скорости машины. Основные render animations продолжают читать реальные часы, поэтому это выполняется не для всей картинки.

Подтверждённые источники времени

  • game/film.rs::film_step меняет dt симуляции на точный шаг видео.
  • gfx/hd/mod.rs::write: HdFrame.water.y=(self.started.elapsed().as_secs_f64()%600) — реальные часы.
  • gfx/hd/materials.rs::wind_seconds: static Instant, elapsed()%600, также wall clock; используется в terrain/foliage rendering.
  • film_before_render при cut дополнительно делает warmup render frames. Их реальные затраты тоже двигают эти часы, хотя записанного времени не прибавляется.
  • Облачный ветер получает game/cloud time, а не replay timestamp: day_time override сам по себе не обеспечивает правильную паузу/seek ветра облаков.

Эффект

Если кадр 60 fps офлайн рендерится секунду, волны/ветер проходят примерно секунду между выходными кадрами вместо 1/60 секунды. Более медленная машина или другое качество создаёт другую анимацию/скорость воды. Cut warmup тоже может дать скачок. Пауза/seek фильма не останавливают wall-clock эффекты.

Это установлено по источникам времени; скорость на конкретном Mac и GPU-экспорт здесь не измерялись.

Нужно

Передавать явный render clock контекста: live, replay timestamp/rate, fixed capture timestamp. Вода, ветер, облака, дым, dither/history должны иметь согласованные правила; warmup меняет накопление, но не историческое время. Отделить game day_time от elapsed animation time. Сохранить обычную анимацию live игры.

Приёмка

Экспорт одной записи с искусственной задержкой GPU/CPU и без неё даёт одинаковую фазу воды/ветра на кадре N; одинаковый timestamp после seek. Пауза и cut warmup не прокручивают мир за кадром. Проверить 24/30/60 fps, slow motion и два последовательных запуска.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `76f680eba64b64eb28435e71ce9f22a84b0e5da1` (после `6f3fc64`). Контракт capture API из патча 32 обещает фиксированное `1/fps` время кадра независимо от скорости машины. Основные render animations продолжают читать реальные часы, поэтому это выполняется не для всей картинки. ### Подтверждённые источники времени - `game/film.rs::film_step` меняет dt симуляции на точный шаг видео. - `gfx/hd/mod.rs::write`: `HdFrame.water.y=(self.started.elapsed().as_secs_f64()%600)` — реальные часы. - `gfx/hd/materials.rs::wind_seconds`: static Instant, `elapsed()%600`, также wall clock; используется в terrain/foliage rendering. - `film_before_render` при cut дополнительно делает warmup render frames. Их реальные затраты тоже двигают эти часы, хотя записанного времени не прибавляется. - Облачный ветер получает game/cloud time, а не replay timestamp: day_time override сам по себе не обеспечивает правильную паузу/seek ветра облаков. ### Эффект Если кадр 60 fps офлайн рендерится секунду, волны/ветер проходят примерно секунду между выходными кадрами вместо 1/60 секунды. Более медленная машина или другое качество создаёт другую анимацию/скорость воды. Cut warmup тоже может дать скачок. Пауза/seek фильма не останавливают wall-clock эффекты. Это установлено по источникам времени; скорость на конкретном Mac и GPU-экспорт здесь не измерялись. ### Нужно Передавать явный render clock контекста: live, replay timestamp/rate, fixed capture timestamp. Вода, ветер, облака, дым, dither/history должны иметь согласованные правила; warmup меняет накопление, но не историческое время. Отделить game day_time от elapsed animation time. Сохранить обычную анимацию live игры. ### Приёмка Экспорт одной записи с искусственной задержкой GPU/CPU и без неё даёт одинаковую фазу воды/ветра на кадре N; одинаковый timestamp после seek. Пауза и cut warmup не прокручивают мир за кадром. Проверить 24/30/60 fps, slow motion и два последовательных запуска.
chexit added the area:toolingtype:bugarea:renderingpriority:P2 labels 2026-10-30 09:56:25 +00:00
Author
Owner

🤖 Agent: Сделано в 0f5c4136f3 (запушено в main). Вода, ветер и ветер облаков при экспорте идут по кадрам фильма. При обычном просмотре пауза и перемотка облака не останавливают.

🤖 Agent: Сделано в https://gitea.maoniao.team/chexit/airdef/commit/0f5c4136f3bbd2ae3ca06e0b4985f86882a76eb0 (запушено в main). Вода, ветер и ветер облаков при экспорте идут по кадрам фильма. При обычном просмотре пауза и перемотка облака не останавливают.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#80