[bug] Завершение MP4-экспорта выбрасывает последние кадры из GPU-очереди #79

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

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

Ревью 76f680eba64b64eb28435e71ce9f22a84b0e5da1 (после 6f3fc64). В новом engine crates/horizon-client/src/game/film.rs::film_finish неотменённый захват завершает readback так:

r.capture_ready(0).and_then(|_| {
    // Everything in flight, waited for.
    r.capture_ready(0)
})

Но gfx.rs::Renderer::capture_ready уже извлекает готовые/дожданные frames из capture_queue и возвращает Vec<CapturedFrame>. При keep=0 оно ждёт очередь и опустошает её. Первый Vec выбрасывается через |_|; второй вызов обычно возвращает пустой Vec. Только второй результат посылается writer thread.

Эффект

Если в момент stop есть readback frames in flight (в штатном after-render допускается keep=2), хвост видео теряется. Экспорт может числиться успешным, но sent/длина/последний кадр не соответствуют реально захваченным; PCM для этих кадров мог быть уже смешан. Проявление зависит от задержки GPU. Это подтверждено прямой семантикой двух функций, полноценный GPU export здесь не запускался.

Нужно

Единожды дождаться и получить остаток, передать все кадры в writer по порядку, затем Finish. Ошибки readback/send отражать в результате. Отмена по-прежнему может явно discard. Не маскировать потерю хвоста успешным статусом/коротким mux.

Приёмка

Fixture очередь с последними номерами N-1/N, включая неготовые буферы: writer получает каждый ровно один раз, без пропуска и перестановки. Проверить 0/1/2 pending, медленный GPU, нормальный stop и cancel. В MP4/PNG ожидаемое число кадров и последний видимый кадр совпадают с capture timeline.

Связано с #58, engine fork patch 32.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `76f680eba64b64eb28435e71ce9f22a84b0e5da1` (после `6f3fc64`). В новом engine `crates/horizon-client/src/game/film.rs::film_finish` неотменённый захват завершает readback так: ```rust r.capture_ready(0).and_then(|_| { // Everything in flight, waited for. r.capture_ready(0) }) ``` Но `gfx.rs::Renderer::capture_ready` **уже извлекает** готовые/дожданные frames из `capture_queue` и возвращает `Vec<CapturedFrame>`. При keep=0 оно ждёт очередь и опустошает её. Первый Vec выбрасывается через `|_|`; второй вызов обычно возвращает пустой Vec. Только второй результат посылается writer thread. ### Эффект Если в момент stop есть readback frames in flight (в штатном after-render допускается keep=2), хвост видео теряется. Экспорт может числиться успешным, но `sent`/длина/последний кадр не соответствуют реально захваченным; PCM для этих кадров мог быть уже смешан. Проявление зависит от задержки GPU. Это подтверждено прямой семантикой двух функций, полноценный GPU export здесь не запускался. ### Нужно Единожды дождаться и получить остаток, передать **все** кадры в writer по порядку, затем Finish. Ошибки readback/send отражать в результате. Отмена по-прежнему может явно discard. Не маскировать потерю хвоста успешным статусом/коротким mux. ### Приёмка Fixture очередь с последними номерами N-1/N, включая неготовые буферы: writer получает каждый ровно один раз, без пропуска и перестановки. Проверить 0/1/2 pending, медленный GPU, нормальный stop и cancel. В MP4/PNG ожидаемое число кадров и последний видимый кадр совпадают с capture timeline. Связано с #58, engine fork patch 32.
chexit added the area:toolingtype:bugarea:renderingpriority:P2 labels 2026-10-30 09:56:13 +00:00
Author
Owner

🤖 Agent: Сделано в 0f5c4136f3 (запушено в main). Все кадры в полёте доходят до записи, ошибка больше не маскируется. Экспорт 6 с при 30 fps дал 183 кадра и 6,1 с; потерю на кадрах в полёте в игре не провоцировали, это покрыто тестом.

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

No dependencies set.

Reference: chexit/airdef#79