书记:《Unity游戏优化第三版》
内容来自《Unity游戏优化第三版》,书中内容也不一定全对,有比较基础的部分,做个简要记录
第二章:脚本策略
- 获取组件采用泛型获取即:
GetComponent<T>
- 移除MonoBehaviour中空定义,即如果不需要Update OnGUI等Unity的回调函数,直接删除
- 避免在运行时修改Transform的父对象
在Unity早期版本中,Transform组件的引用通常是在内存中随机排列的
也就是在多个Transform迭代是相当慢的,会存在缓存丢失的可能修改GameObject的父节点为另一个对象不会造成显著的性能下降,因为Transform操作起来像堆数据结构,插入和删除的速度相对较快
但是在Unity5.4以后,Transform组件的内存布局发生了很大的变化
Transform组件的父子关系操作起来更像动态数组,Unity尝试将所有共享相同的父元素 Transform 按顺序存储在预先分配的内存缓冲区中的内存中,并在 Hierarchy 窗口下的深度进行排序
这样做的好处就是可以进行更快的迭代,尤其是物理和动画系统。缺点:
1.如果将一个 GameObject 的父对象重新指定为另一个对象,父对象必须将新的子对象放入预先分配的内存缓冲区中,并根据新的深度对所有这些 Transform 排序
2.如果没有预先分配足够的空间来容纳新的子对象,就必须扩展缓冲区,以便以深度优先的顺序容纳新的子对象通过 Object.Instantiate() 实例化新的 GameObject 时,其默认的父节点是 null,都放在 Hierarchy的根元素下
这里的所有元素同样也需要分配一个缓冲区来存储他当前的元素以及以后可能添加的元素
如果需要立即将Transform的元素重新修改为另一个元素,刚才的缓冲区就白分配了
尽可能使用参数,跳过缓冲区分配的步骤
在Instantiate()Gameobject的时候,如果要进行父对象变化,可以先直接传入,避免变化
有多个变化,尽量使用一次性变化,例如使用SetPositionAndRotation