Files
ArtPlayer/refactor/changes/2026-09-14-PKG-JASSUB-10-render-resources.md

3.6 KiB
Raw Permalink Blame History

PKG-JASSUB-10 绘制异常后的位图释放

修复主线程 asyncRender 的整批资源归属。旧 wrapper 在 drawImage 成功之后才关闭 当前 ImageBitmap;clearRect、画布尺寸更新或任意一次 drawImage 抛错,会跳过当前 和剩余位图的释放。现在在 finally 释放本消息的整个异步位图批次,原生异常继续 向调用方传播;正常绘制顺序、Worker 协议、公开类型和默认渲染模式保持不变。 同步 ImageData/ArrayBuffer 路径不执行 bitmap.close。

受控测试注入四种失败位置并验证异常对象、绘制次数及每张位图只释放一次。另有 同步缓冲区对照;既有正常 hybrid 绘制、迟到帧及销毁回归保留。原始源码16项中 12通过4失败;这四项都是资源释放断言失败。

原生浏览器测试从真实 JASSUB Worker/WASM 接收 ImageBitmap,再创建两个原生 副本作为同批后续位图。主动关闭第一张触发原生 InvalidStateError,检查其余位图 width归零并强制下一帧绘制,绿色字幕像素必须恢复。它证明受控异常后的清理, 不声称 Worker 会自然产出损坏位图,也不把它当成 Firefox 默认 offscreen 停顿的 根因或修复。初版测试误读 plugins.add 返回值导致的三项初始化失败单独保留; 修正后旧产物三浏览器都在剩余位图未释放的断言失败,不能混用两轮失败证据。

首轮候选的位图释放三浏览器都通过,但两项字幕恢复失败。原因是测试在仍有待处理 demand 时调用 resize(force),现有实现有意忽略 busy 状态的强制重绘。测试现在暂停 原生video、等待当前需求完成,再调用同一公开resize;没有修改生产时钟,也没有 延长等待。最终main三项异常恢复通过;legacy与正常播放合跑12项通过。旧产物以 最终浏览器测试重新执行,三项仍在位图释放断言失败,证明不是等待变化掩盖缺陷。

最终验证:

  • 固定 Node24.21.0 / Yarn1.22.22;严格工具链检查通过。
  • 全包201项通过;实际main/legacy的运行时、生命周期、帧回调、offscreen组各69项通过。
  • 最终受控旧main16项中12通过4失败;源码修复后的对应测试通过。仅在最后添加测试 if分支的格式花括号,不改变条件或断言;lint最终通过。
  • 正常main/legacy/ESM均正常构建,分别与docs副本核对字节;严格包TS通过,核心37份 生成声明无漂移。没有修改消费者声明,未把已有安装验收报告当成此次重新安装。
  • main:3项真实位图异常/恢复,以及三核心×三浏览器9项真实WASM字幕播放、seek、 布局、资源销毁;legacy同样12项通过。无重试、无跳过。
  • 浏览器为Windows Chromium153.0.8010.12、Firefox155.0、WebKit26.6;明确主线程 asyncRender。原生故障注入仅candidate核心,正常播放另含两个旧核心。不是物理 Apple/Android设备、默认offscreen、持续GPU内存压力、完整组合或远端CI验收。

本次是独立任务,依赖已完成的初始化/生命周期基础。当前Git基线包含09尚未全部 验收的修复检查点;其未关闭的默认模式问题继续由09/05跟踪,不能因10通过而关闭。 第四段vendor补丁保留前三段原指纹与可逆diff,第三方清单记录最新实际源码指纹。 没有更换Worker/WASM/字体、依赖、版本、公开声明或发行入口。

验证结果和具体候选/报告指纹见 机器记录。回退本任务独立提交并正常 重建包可恢复旧行为;不要只改来源清单或只回退一份分发格式。没有push/publish。