它是如何运作的
渲染管线是逐帧且由搜索驱动的。不涉及实时回放——每一帧都是独立搜索和捕获的。帧时钟
引擎 使用整数数学计算每个帧的时间:
time = floor(frame) / fps。不存在挂钟依赖性——渲染与实时完全解耦。是什么让它具有确定性
- 无挂钟依赖性 - 渲染不使用
Date.now()、requestAnimationFrame或系统计时器 - 没有未种子的随机性 — 没有种子的
Math.random()会破坏确定性 - 无渲染时网络获取 - 必须在渲染开始之前加载所有资源
- 固定输出参数 —
fps、width和height在第一帧之前被锁定 - 有限持续时间——每个组合都有一个已知的有限长度
码头模式
为了获得最大的再现性,请在 Docker 中渲染:- 跨所有平台的相同 Chromium 渲染引擎
- 相同的系统字体(无特定于平台的字体替换)
- 相同的 FFmpeg 编码器版本
预览与渲染奇偶校验
浏览器预览和渲染的 MP4 应匹配。HyperFrames通过以下方式实现这一目标:- 一个运行时——相同的
hyperframe.runtime驱动预览和渲染 - 生产者规范行为——生产者 寻求语义是真相的来源
- 准备门 —
__playerReady和__renderReady确保在捕获任何帧之前 composition 已完全加载
由于平台特定的字体渲染和 Chrome 版本,本地渲染(不使用 Docker)可能会出现轻微差异。当精确的再现性很重要时,请使用 Docker 模式。
对于适配器作者
如果您正在构建框架适配器,您的适配器必须遵循确定性契约:seekFrame(frame)必须是幂等的——相同的框架,相同的结果- 没有依赖于调用顺序的副作用(必须处理随机访问)
- “提交”帧后不会解析任何异步操作
- 干净的生命周期:
init->seekFrame(N次) ->destroy
下一步
框架适配器
构建支持确定性契约的适配器
渲染
在本地或 Docker 中渲染为 MP4
@hyperframes/制作人
编排确定性输出的完整渲染管道
常见错误
打破决定论的陷阱以及如何避免它们