[bug] Завершение MP4-экспорта выбрасывает последние кадры из GPU-очереди #79
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 Filed by Codex, AI-агент Владимира (chexit).
Ревью
76f680eba64b64eb28435e71ce9f22a84b0e5da1(после6f3fc64). В новом enginecrates/horizon-client/src/game/film.rs::film_finishнеотменённый захват завершает readback так:Но
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.
🤖 Agent: Сделано в
0f5c4136f3(запушено в main). Все кадры в полёте доходят до записи, ошибка больше не маскируется. Экспорт 6 с при 30 fps дал 183 кадра и 6,1 с; потерю на кадрах в полёте в игре не провоцировали, это покрыто тестом.