Transform
2018版本前
每次修改 Transform
中的任何属性,如 Position
、Rotation
、Scale
、Parent
、Sibling Order
等,都会触发内部的广播
这个时候会通知其他组件去更新他们的状态,如:
PhysX/Box2D
、UnityUI
、Renderers
等
可以采用 Transform.SetPositionAndRotation
这个API 来一次性更新所有属性, 这样就不会产生多次 Invoke
2018 版本后
这个版本中, Unity 移除了 OnTransformChanged
功能,取而代之的是位运算的 SetDirty
这样每个需要更新的组件只关心自己的位是否已经设置为
Dirty
- 当更改任何一个
Transform
时,会将整个层级结构设置为Dirty
- 当检测到脏层级结构时,
Unity
会检查整个层级中改变的位
内存分布
在 Unity 5.4+ 以后,单个节点的 Transform
在内存的分布上不再是离散的, 而是连续的
优化建议
尽量在层级结构中做一些分离
更小的层级结构 = 更精细的层级跟踪
更小的层级结构 = 更少的Transform
检查
更少的Roots
= 更多的Transform
检查
在下面极端的测试案例中,我们可以看到两者之前的性能区分
左边的测试用例,100个根节点,每个下面有1000个空的
GameObject
和一个带自身旋转脚本的Cube
右边的是 100000 个空
GameObject
和 100 个带自身旋转脚本的Cube
两者之间的性能相差20倍,这里耗费的性能还仅仅是层级检测