第二章 脚本策略
- 使用Getcomponent<T>()方法最快,避免使用Getcomponent<string>。
- 避免在MonoBehaviour脚本文件中出现空定义,比如:空的Start()、Update()函数等。可以使用VS regex表达式搜索出空定义。(所有通用的Unity代码编辑工具都可)。
- 要达到60FPS,每帧应在16.667毫秒内完成所有Update()回调中的所有工作。而在Update()中,常见的性能问题:
- 反复计算很少或从不改变的值
- 太多的组件计算一个可以共享的结果
- 执行工作的频率远超必要值
- 尽量在Awake()中引用组件等,避免在Update()中引用。
- 共享计算输出
- 控制Update()中某些函数调用、协程的频率使用Time.deltaTime。
- 不要混淆协程和线程,线程以并发的方式在完全不同的CPU内核上运行,而且多个线程都可以同时运行。而协程以顺序的方式在主线程上运行,在任何给定时刻都只处理一个协程,每个协程通过yield语句决定何时暂停和继续。启动协程消耗成本大约是标准函数3倍。一旦初始化,不管组件是否禁用,都将继续调用协程。协程会在包含它的GameObject变为不活动时自动停止。如果GameObject重新设置为可用,协程不会自动启用。
- 协程应该尽量简单且独立于其他复杂子系统。因为协程很难调试且触发不稳定。
- 可考虑InvokeRepeating()替换使用WaitForSecond或WaitForSecondRealtime编写的简单函数。
- InvokeRepeating()完全独立于MonoBehavior和GameObject的状态。销毁关联的MonoBehaviour或它的父GameObject。禁用都不会停止,
- 避免从GameObject取出字符串属性,比如tag和name,会产生跨越本机-托管桥接。tag比较可以使用CompareTag()的方法。
- 使用合适的数据结构。希望遍历一组对象,最好使用列表。如果两个对象关联且有很多操作,最好使用字典。
- 避免运行时修改TransForm的父节点,因为会涉及到父节点的内存分配。
- 注意Transform的使用,Transform组件只存储与其父组件相关的数据。访问和修改Transform的position、rotation或scale属性会导致大量未预料的矩阵乘法计算。
- 避免的运行时使用Find()和SendMessage()方法。在大量物体的场景中就算在Awake()时使用Find()都是不推荐的。