unity3d引擎缓存优化技术_基于 Unity 引擎的游戏开发进阶之 游戏性能优化

本文介绍了Unity游戏性能优化,包括CPU优化、渲染优化和内存优化。通过缓存对象引用、减少GetComponent调用、利用对象池技术减少对象创建销毁开销,以及优化渲染系统如减少顶点数量、使用遮挡剔除和LOD技术,降低CPU和GPU负担。同时,通过合理使用垃圾回收和压缩资源,控制内存占用,提高游戏性能。
摘要由CSDN通过智能技术生成

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 函数创建僵尸对象。禁用创建好的僵尸对象,把它

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值