Unity 行为差异
Natsume 复现 Unity 的行为,但有些行为无法做到逐位一致。差异的来源、度量方式、已知的近似和不复现的部分如下。
如何度量
差异数据来自仓库里的 Unity 探针(tools/unity-probe)。探针在本地的 Unity Editor(2022.3.21f1)里运行合成的测试场景,记录曲线、粒子位置、速度、事件帧等数值,Natsume 的回归测试再与这些记录比较。
读取数据时请注意:
- 误差是已测的最大绝对差,位置和速度使用场景单位,角度使用弧度,另行标注百分比的除外。
- 误差为
0只代表已测的输入一致,不代表所有输入一致。 - 随机分布比较的是统计量。统计量一致不代表同一个种子下逐粒子一致。
- 各项指标不合并为一个整体的百分比。
- 整个包的生命周期通过,不代表画面与 Unity 逐像素一致。
完整的测量记录和每一项的样本规模见仓库中的 MEASUREMENTS.md。
部分已测结果
| 行为 | 样本规模 | 最大差 |
|---|---|---|
| 外部力场 | 384 组,dt = 0.02 s | 位置 8.150×10⁻¹⁰,速度 3.726×10⁻⁸ |
| Planes 碰撞 | 81 组 | 位置 1.999×10⁻⁵ |
| World 碰撞 | 81 组 | 位置 3.640×10⁻⁴,速度 4.769×10⁻⁷ |
| 粒子 Trigger | 216 组,每组 38 帧 | 位置 3.052×10⁻⁵,事件类型、发生帧和 Collider 列表为 0 |
| Linear 动画曲线 | 480 组四关键帧曲线 | 2.934×10⁻⁶ |
| Hermite 动画曲线 | 同上 | 2.918×10⁻⁶ |
| Noise 位移(相对 RMS 差) | 86 组 × 512 粒 | 0.000081% |
| Noise 同种子首步 | 三档共 2,064 个分量 | 位置 9.537×10⁻⁷ |
近似行为
这些行为在 Natsume 里是近似的。相关的预检警告或实例诊断会提醒你,诊断码的说明见诊断与错误。
| 行为 | 说明 |
|---|---|
| Noise | 使用实测的 Perlin 旋度场,Low、Medium、High 分别对应一维、二维、三维势函数,并使用实测的种子偏移。未穷举所有 Remap 和曲线的组合。 |
| Linear 纹理过滤 | 保留已测的颜色插值近似。 |
| 普通 Stretch | 没有 viewPosition 时使用平行视线近似。 |
| Freeform Stretch | 速度与视线平行时使用稳定的朝向,不复现 Unity 的浮点抖动。 |
| 碰撞的 quality 和 voxel | 交给宿主的球体扫掠,不复现 Unity 原生体素缓存的历史。 |
不复现的行为
| 行为 | 原因 |
|---|---|
| 粒子的出生序列 | Natsume 内的随机通道可复现,但与 Unity 原生种子产生的出生结果不同。 |
| 共享子发射器的任务交错 | Unity 的任务调度会改变出生年龄和寿命边界的数量。Natsume 默认使用稳定调度,也允许宿主指定顺序,但包里没有 Unity 的全局任务队列,指定顺序不保证复现其他场景的交错。 |
| 延迟预热的停滞 | 三层预热与启动延迟的组合可能让 Unity 2022.3 停滞,Natsume 继续播放。 |
| 不透明材质的分组身份 | Unity 的临时材质对象 ID 不在包里,同队列的不透明材质按包内声明的逆序分组。 |
| 光照与阴影 | 已知的无光照配方不使用阴影、光照探针和反射探针,Natsume 不生成三维光照环境。 |
| 相机的 HDR、MSAA 和动态分辨率 | 由宿主的绘制目标决定,不分配独立的相机目标。 |
| Script Bridge 的游戏逻辑 | 包里的 C# 不会被执行,需要宿主自己实现。 |
尚未量化的部分
测量记录里列出了还没有原生对照数据的范围,包括任意的 Shape、模拟空间和 Renderer 的交叉组合,透视视图下的像素,非默认 Sorting Layer,以及整个包的 Unity 画面。这些范围里的行为不应被当作已经验证。