Unity代码性能优化:UnityAPI篇章

本文总结了Unity游戏开发中的性能优化要点,包括避免频繁调用GetComponent,减少使用SendMessage和BroadcastMessage,慎用Find系列函数,优化生命周期函数,缓存Camera.main,减少访问transform属性,利用协程优化定时任务,高效比较GameObject,减少计算平方根,以及注意运算顺序等。通过这些实践,可以显著提高Unity应用的运行效率。
1.GetCompoent 方法有一些变体,他们的性能并不相同
  • GetComponent<Transform>(); 效率最高推荐使用
  • GetComponent(typeof(Transform));效率低于上一条,但是没有差太多
  • GetComponent("Transfrom"); 效率最慢
  • 避免在Update或者每次使用都执行一次获取组件,建议缓存起来
2.避免使用SendMessage()、BroadcastMessage(),因为内部使用了反射,应该基于观察者模式实现自己的事件系统
3.避免使用Find系列,这些都会遍历场景中的物体、组件
  • GameObject.Find("Player");
  • GameObject.FindWithTag("Player");
  • GameObject.FindGameObjectsWithTag("Player");
4.避免空的的生命周期函数,如Awake、Start、OnEnable、Update、FixedUpdate、LateUpdate等等,即时是空的也会浪费性能。另外一个角度来说也可以尽可能减少Update的出现次数,比如建立一个自己的Update层
5.避免使用Camera.main,虽然Unity做了缓存,但是看起来还是不如自己缓存来得快,不过影响也不大
6.每次访问transform.position或rotation都有额外的消耗,尽可能通过缓存结果来达到使用,比如只在开始的获取和结尾的赋值才使用
7.Update中进行一些计时器的操作,比如每过5秒执行一次XX函数,建议使用协程,因为Update虽然调用一次的成本会低于协程,但是每帧都调用且五秒后才执行一次XX函数,其成本高于协程,但是如果在协程里面yield return null 一次然后就执行一次XX函数,那么他的成本反而会高于Update。总的来说可以理解成调用一次协程或yield return 一次的成本是三个Update,虽然协程每帧都会被访问并做一定的计算,但是这个行为的成本是低于调用Update的,核心的是yield return new WaitForSeconds(5f)是五秒调用一次,五秒内可能已经跑了几百帧了。不过也不需要太较真,这只是一点细节,因为我们如果根据第四条减少Update的话,那么就需要计时的替代合理方案
8.GameObject!=null,当我们对GameObject类型和空引用做比较时会产生额外的性能消耗,这点不同于我们的C#对象,可以使用 System.Object.ReferenceEquals(GameObject, null) 来代替
9.尽量减少从GameObject中访问tag和name,如果一定要用的话请选择tag,但是在比较时可以使用gameObject.CompareTag("tag");
10.尽可能减少计算平方根,用Vector3.SqrMagnitude代替Vector3.magnitude
11.Vector3 * int/float 相当于Vector3的x、y、z都进行一次计算,所以在运算的时候要考虑顺序问题:
  • transfrom.position * speed*Time.time 错误
  • speed * Time.time * transfrom.position 正确 高于U
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值