Transform

2018版本前

每次修改 Transform 中的任何属性,如 PositionRotationScaleParentSibling Order 等,都会触发内部的广播

这个时候会通知其他组件去更新他们的状态,如:PhysX/Box2DUnityUIRenderers

可以采用 Transform.SetPositionAndRotation 这个API 来一次性更新所有属性, 这样就不会产生多次 Invoke

2018 版本后

这个版本中, Unity 移除了 OnTransformChanged 功能,取而代之的是位运算的 SetDirty

这样每个需要更新的组件只关心自己的位是否已经设置为 Dirty

内存分布

在 Unity 5.4+ 以后,单个节点的 Transform 在内存的分布上不再是离散的, 而是连续的

Pasted image 20201201104454.png

优化建议

尽量在层级结构中做一些分离

更小的层级结构 = 更精细的层级跟踪
更小的层级结构 = 更少的 Transform 检查
更少的 Roots = 更多的 Transform 检查

在下面极端的测试案例中,我们可以看到两者之前的性能区分

左边的测试用例,100个根节点,每个下面有1000个空的 GameObject 和一个带自身旋转脚本的 Cube

右边的是 100000 个空 GameObject 和 100 个带自身旋转脚本的 Cube

两者之间的性能相差20倍,这里耗费的性能还仅仅是层级检测

Pasted image 20201201110259.png

Pasted image 20201201110409.png

Pasted image 20201201110715.png