Skip to content

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⁻⁷
粒子 Trigger216 组,每组 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 画面。这些范围里的行为不应被当作已经验证。

基于 Apache License 2.0 发布