现象
暂停后拖动播放头/scrub 时极卡,严重时整台电脑卡死(疑似 ffmpeg 子进程风暴或 wgpu 驱动挂起)。
根因(疑似)
暂停态预览靠 composite_frame:每帧 = 一次 ffmpeg 解码 + wgpu 合成 + PNG 编码 + base64 传输 + 主线程 <img> 解码。scrub 时播放头逐帧变化 → 逐帧触发 composite → 大量 ffmpeg 子进程 / GPU 工作堆积 → 卡死。
位置
web/src/components/preview/useTimelineFrame.ts(拉取/节流/coalesce)
web/src/components/preview/Preview.tsx(何时启用 composite)
src-tauri/src/render.rs 的 composite_frame 命令、crates/opentake-render、crates/opentake-media/src/decode/frame.rs(Rust 侧 ffmpeg+wgpu)
已做缓解(本 PR)
- composite 拉取改为停稳 ~140ms 后才取(
Preview.tsx useDebounced),scrub 全程不再逐帧合成。
- 暂停态合成帧改稳健等比盒(修复"跑到角落/很小")。
- 仍需真机验证是否彻底消除卡死(本机 computer-use 被 Dock 拦截,无法真机复现)。
彻底修复方向
- 实现真实播放/scrub 引擎(连续解码 + wgpu 上屏 + 精确 seek + 预览降档),见 Realtime-playback issue(1:1 蓝图 P1-10、工程量最大)。
- 短期可:composite 并发限 1(已 inFlight);scrub 仅松手取一帧;降低 composite 分辨率(maxSize);排查 wgpu 是否每次新建上下文/泄漏纹理。
cc @appergb
现象
暂停后拖动播放头/scrub 时极卡,严重时整台电脑卡死(疑似 ffmpeg 子进程风暴或 wgpu 驱动挂起)。
根因(疑似)
暂停态预览靠
composite_frame:每帧 = 一次 ffmpeg 解码 + wgpu 合成 + PNG 编码 + base64 传输 + 主线程<img>解码。scrub 时播放头逐帧变化 → 逐帧触发 composite → 大量 ffmpeg 子进程 / GPU 工作堆积 → 卡死。位置
web/src/components/preview/useTimelineFrame.ts(拉取/节流/coalesce)web/src/components/preview/Preview.tsx(何时启用 composite)src-tauri/src/render.rs的composite_frame命令、crates/opentake-render、crates/opentake-media/src/decode/frame.rs(Rust 侧 ffmpeg+wgpu)已做缓解(本 PR)
Preview.tsxuseDebounced),scrub 全程不再逐帧合成。彻底修复方向
cc @appergb