Unity 游戏性能优化主要分为:CPU 优化
渲染优化
内存优化
CPU 优化
CPU 的优化要以性能分析为指导,根据数据分析结果,找能性能瓶颈,才能以最快的速度优化游戏。CPU 分析器、 时间轴会统计渲染系统、 物理系统、 脚本、 垃圾回收、垂直同步以及全局光照等模块的 CPU 使用情况。
点击 Game 视图右上角的 Statistics 可以开启信息统计窗口,该窗口显示游戏运行时,当前帧的声音和图像信息,帮助我们分析游戏性能。
我们通过游戏项目中实现优化 CPU 的具体方法。
缓存重要对象的引用
在 Unity 脚本中,使用 GameObject.Find 这类函数获取游戏对象;使用 GetComponent 这类函数以及 transform 这类的内置访问器获取组件,会产生较多开销。
void Update(){
transform.Translate(0.0f, 1.0f, 0.0f);
GetComponent().AddForce(Vector3.up);
}
在 Update 函数中,每帧使用内置访问器获取 transform 组件 使用 GetComponent 函数获取刚体组件是非常耗时的。
可以在 Awake 或者 Start 函数中,获取一次组件引用,把引用缓存在当前 class 的字段中,供 Update 等函数使用 这样可以减少每帧获取组件带来的开销。
private Rigidbody myRigidbody;
private Transform myTransform;
void Awake(){
myRigidbody = GetComponent();
myTransform = transform;
}
void Update(){
myRigidbody.AddForce(Vector3.up);
myTransform.Translate(0.0f, 1.0f, 0.0f);
}
在 Awake 函数中获取刚体组件和 transform 组件的引用,它们缓存在当前的 class 的私有字段中,然后在 update 函数中通过私有字段,来使用刚体和 transform 组件。
在脚本中,空的回调函数也会消耗 CPU 时间。我们应该删除空的回调函数,而不是留空。例如,Unity 新建脚本时,会自动添加 Start 和 Update 两个函数。如果我们不使用这两个函数,应该手动删除它们。
//如果函数内为空,应当删除
void Start(){
}
void Update(){
}
频繁地使用 Instantiate 和 Destroy 函数,创建和销毁游戏对象,会为脚本执行和垃圾回收带来很大的性能开销。
我们使用对象池技术,优化游戏对象的创建和销毁。创建一个数组或者链表作为对象池。 实例化一组对象,把它们设置为未激活状态,放入对象池。
如果需要创建对象,我们直接从对象池中取出一个未激活对象,激活该对象,设置相关操作,然后直接使用即可。
如果需要销毁对象 只需禁用该对象,然后把它放入对象池即可。
对象池技术节省了很多内存的申请和垃圾回收操作带来的性能开销。
用一个例子来讲解对象池技术。
敌人(僵尸)是一种需要频繁创建和销毁的游戏对象,可以用对象池管理僵尸的创建和销毁。
public GameObject zombiePrefab;//僵尸预制件private GameObject[] instances;//僵尸数组对象池public static Vector3 defaultPosition = new Vector3(33, -6, -8);//僵尸的默认生成地点
void Start () {
//生成僵尸对象池instances = new GameObject[maximumInstanceCount];
//初始化僵尸对象池for(int i = 0; i < maximumInstanceCount; i++) {
//生成一个僵尸GameObject zombie = Instantiate (zombiePrefab,
defaultPosition, Quaternion.identity) as GameObject;
//禁用僵尸zombie.SetActive (false);
//把僵尸放入僵尸对象池instances [i] = zombie;
}
}
在 Start 函数中,创建一个僵尸类数组作为对象池。然后开始使用 Instantiate 函数创建僵尸对象。禁用创建好的僵尸对象,把它