mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-12 23:36:15 -08:00
refactor(danmuku): [PKG-DANMUKU-04] own scheduler and worker request lifecycle
This commit is contained in:
1 parent
0b2efb07f1
commit
12332df221
24 files changed
+23441
-461
No files matched your search
@@ -0,0 +1,84 @@
|
||||
# PKG-DANMUKU-04 时钟、队列与轨道调度
|
||||
|
||||
弹幕调度现在只有一个待执行RAF或异步准备帧。新增`src/scheduler.js`负责运行归属、
|
||||
取消、失败和恢复,`src/queue.js`负责状态池与候选顺序,`src/worker-client.js`负责
|
||||
请求关联和Worker收尾。`danmuku.js`保留公共行为出口;原`worker.js`轨道算法逐字未改。
|
||||
本步仍是JS职责拆分,完整TS和最新npm根声明/准确`/runtime`归06。
|
||||
|
||||
## 行为与兼容边界
|
||||
|
||||
- 原生play/playing可以重复进入start,仍保留旧start事件;内部只能有一条运行链。
|
||||
队列先ready后wait,保留当前媒体时间前后0.1秒窗口、状态池顺序和原轨道几何。
|
||||
- 暂停、reset、替换输入成功提交、hide、seeking、destroy以及更换beforeVisible
|
||||
使旧准备工作失效。取消与用户Promise竞速,新工作不必等待旧回调结束。
|
||||
每次await及用户回调后检查归属;回收前检查节点身份,避免旧续体回收新节点。
|
||||
- hide、seeking和回调更新保留已显示/暂停节点;seek不额外发reset。Date.now寿命
|
||||
排除暂停时间;同步倍率仍只在新弹幕分配时取值,不顺便改写现有弹幕剩余寿命。
|
||||
- beforeVisible拒绝沿现有error出口发原错一次,本轮跳过该项并继续其他项;false
|
||||
仍可下一帧重试。显式start/reset或其他失效动作允许仍符合时间条件的失败项重试。
|
||||
错误监听器自身抛错有局部观察,不产生脱离调用链的未处理RAF拒绝。
|
||||
- Worker共享回复监听在post前安装,ID在请求及Worker替换之间递增,避免同毫秒串线。
|
||||
反序、同步、重复、未知和迟到回复不会完成其他请求。取消的内部请求解析为
|
||||
`{ id, result: undefined }`;故障以原错拒绝待处理请求,独立尝试解绑及terminate。
|
||||
- Worker故障停止内部调度但不伪造公共stop。后续start/reset可重建;重复失败等待
|
||||
下次显式恢复。错误监听器可能同步destroy/stop/reset/hide或嵌套start,因此恢复
|
||||
后再次检查生命周期、generation和启动序号,过期start不能继续或发迟到start事件。
|
||||
- 门面方法、getter、同步/异步返回及内部实例身份保持。配置回调保持当前option为this。
|
||||
合法的NaN时间保持旧currentTime+0.5;零保持03明确修正后的0,正无穷保持原值,
|
||||
负无穷仍钳位0,不扩大原验证器对null等输入的接受范围。
|
||||
|
||||
## 发现的问题先修复,再保留证据
|
||||
|
||||
最初18项调度测试为6通过12失败;03实际main在两核心的8个Chromium场景为4通过4失败,
|
||||
具体包括六条弹幕产生七个请求、同ID及空visible快照、节点复用时留下额外隐藏节点。
|
||||
这个03快照本身未重叠,02另有真实重叠记录;没有把不同运行的现象拼成同一次失败。
|
||||
|
||||
第一轮候选48项原生矩阵通过后,只读代理发现恢复错误监听器销毁播放器仍继续start。
|
||||
补齐destroy/stop/reset/hide/嵌套start五个回归,保存的修复前真实main在32项中27绿5红,
|
||||
加入恢复所有权检查后全部转绿。随后复审发现03的`time !== undefined`在修正零时
|
||||
误改合法NaN:历史源码/main/legacy均沿旧默认时间,候选24项23绿1红。保留零的显式
|
||||
判断并恢复NaN默认路径,增加历史对照和真实浏览器可见性断言;03旧报告保持原样。
|
||||
|
||||
这些修复作为本步变更记录,新增已解决风险INPUT-02;没有把中间版本的通过当作最终
|
||||
验收。父代理负责复审、构建、浏览器和整合,子代理分别承担调度实现、确定性测试及
|
||||
独立风险复核,同一文件分工不重叠,Git由父代理统一提交。
|
||||
|
||||
## 最终验证
|
||||
|
||||
- 源码、正式main、正式legacy各104项联合通过。每组中83项随候选实现变化,18项
|
||||
直接验证内部Worker客户端/原轨道源码,3项固定历史数值对照。不能把后21项重复
|
||||
宣称为不同产物的额外覆盖。组成:输入24、解析26、调度33、Worker客户端21。
|
||||
- 确定性时钟覆盖三小时媒体范围、180批共720条、15次120秒暂停及暂停中seek,
|
||||
执行真实Worker算法,检查每条一次请求、发射顺序、唯一状态池及4节点全程复用。
|
||||
这是采样生命周期的模拟时钟测试,不是实际三小时播放或帧率/内存基准。
|
||||
- 三种实现各66项原生浏览器通过,共198项:实际已发布核心5.4.0及候选5.4.1,
|
||||
Chromium/Firefox/Windows WebKit。包括三模式、严格轨道几何、播放/暂停/跳转/倍率、
|
||||
节点复用、四种pending取消、恢复重入、NaN、实际设置/发送/mount和双实例。
|
||||
- main和legacy额外各30次密集场景重复,共60次,无跳过、失败或重试后通过。
|
||||
每次六条固定弹幕都断言几何不交叠、顺序、六个唯一请求、visible快照长度0至5、
|
||||
回复关联及六节点;复用场景另断言同一可见节点且额外节点数组为空。
|
||||
- 普通场景要求零页面错误、零Worker错误;恢复场景显式派发受控ErrorEvent并让
|
||||
createWorker抛错,仅允许精确已知故障。实际视频/DOM/Blob Worker继续使用原生实现,
|
||||
但不能把注入故障描述成真实CSP或平台Worker构造失败。Windows WebKit不是Safari设备。
|
||||
- 仓库正常build生成三格式及docs/compiled,逐一核对字节;修改源码/测试/脚本入口lint
|
||||
通过。04未改生产TS或公开声明,引用03全仓366生产TS和消费者检查,未声称04新跑TS。
|
||||
|
||||
构建曾在浏览器运行期间遇Windows UNKNOWN复制错误;停止并行构建后正常串行重建成功,
|
||||
核对main/legacy与当时已测试文件哈希一致。NaN修复后再次完整构建并运行上述最终矩阵。
|
||||
故障日志、串行重试、字节一致性证明及最终结果均保留。新增所有权逻辑使产物变大,
|
||||
机器证据记录相对03的原始/gzip字节,不能声称本步缩包或性能改善。
|
||||
|
||||
证据及输入指纹见[机器报告](../baselines/danmuku-scheduler-validation.json)。原始截图和
|
||||
附件归档独立目录,报告记录原results路径到归档路径的映射,不手改原Playwright报告。
|
||||
未新增依赖或修改Yarn锁;`test:unit`和`test:danmuku`加入调度/Worker客户端测试,新增
|
||||
原生spec沿既有浏览器CI发现。中间48/60项矩阵保存为过程证据,最终引用numeric-final。
|
||||
|
||||
## 风险关闭与下一步
|
||||
|
||||
ASYNC-01由03输入/解析及04可见性/Worker归属共同满足关闭标准;TRACK-01关闭范围仅为
|
||||
已复现的重复运行链和请求串线,以及对应严格几何/节点重复回归。它们不代表任意负载、
|
||||
任意轨道算法或包级资源稳定性已经验收。CLEANUP-01保持开放:Setting外部DOM、发送
|
||||
续体和锁定计时器仍需05处理;heatmap零采样同样未修。05继续DOM渲染/设置/热力图,
|
||||
06完整TS与声明,07真实长负载。完整npm安装、发布前多轮复盘仍待各自任务。
|
||||
|
||||
本任务完成后独立本地commit,无推送、标签或npm发布。
|
||||
Reference in new issue
Block a user