简述
本章讲探索性能优化用于下述领域的方式:
- 访问组件
- 组件回调(Update Awake等)
- 协程
- GameObject和Transform的使用
- 对象间通信
- 数学计算
- 场景和预制加载等的反序列化
使用最快的方法获取组件
GetComponent()方法有一些变体,他们的性能消耗不同,因此要谨慎地调用该方法的最高效版本。3个可用的重载版本GetComponent(string), GetComponent<T>()
和GetComponent(typeof(T)).最好使用的是
GetComponent<T>()
移除空的回调定义
最常使用的四个回调:Awake(),Start().Update().FixedUpdate().
如果没有用到,一定要记得去掉空调用
缓存组件的引用
这个也没有什么好说的,基本就是关于GetConmponet的调用,如果频繁,最好有一个全局变量进行引用。
这个其实很重要, 尤其是在lua中,使用也很频繁,要学会用local来替代多个.的调用。
如
local toolList = DataCenter.jibanData:giftToolList();
共享计算输出
每次执行复杂的操作时候,要考虑是否从多个位置调用它,但总是得到相同的输出。简单来说,是否需要重复调用。
Update、Coroutines、InvokeRepeating
如果不是频繁调用,推荐后面两个,节省更多性能,其中最后一个更好
InvokeRepeating的停用方法是在给定的monoBehavior中调用cancelInvoke(),另一种方法是销毁对应的物体,注意不是禁用
using UnityEngine;
using System.Collections;
public class DelayScript : MonoBehaviour {
//当前时间
private float nowTime;
//执行重复方法的次数
private int count;
// Use this for initialization
void Start () {
nowTime = Time.time;
Debug.Log("时间点:"+nowTime);
this.Invoke("setTimeOut", 3.0f);
this.InvokeRepeating("setInterval", 2.0f, 1.0f);
}
private void setTimeOut()
{
nowTime = Time.time;
Debug.Log("执行延时方法:" + nowTime);
}
private void setInterval()
{
nowTime = Time.time;
Debug.Log("执行重复方法:" + nowTime);
count += 1;
if(count==5)
this.CancelInvoke();
}
}
更快的空引用检查
这个倒是挺稀奇的,之前没有考虑过
以前:
if(gameObject != null){
}
现在:
if(!System.Object.ReferenceEquals(gameObject,null)){
}
避免从GameObject中去除字符串属性
通常不要用.name 进行比较,考虑用tag,而对于tag的比较,要考虑GameObject提供的CompareTag(),这个不会额外占用内存
使用合适的数据结构
这个到没啥,就是列表和字典的区别,即采用顺序存储还是链式存储