Unity 3D优化

前言

优化对游戏开发有很重要的意义,它主要分为三个方面的优化:CPU方面,GPU方面和内存方面的优化

CPU优化

DrawCall

DrawCall是CPU调用底层图形接口,每渲染一次都要调用一次DrawCall,这对CPU无疑是巨大的开销。所以我们主要减少每个对象的渲染次数,多个物体最好一起渲染。主要有以下几个措施:

  • Static Batching静态批处理。

    主要针对状态不会改变物体不移动,如山、石头、校舍等场景类,并且拥有相同的材质,静态批处理允许引擎对 任意大小的几何物体批处理操作来降低描绘调用。可直接在Inspector中勾选“Static”框就行了,如下所示。

这里写图片描述

  • Dynamic Batching动态批处理。

​ 如果动态物体共享相同的材质,则引擎会自动对Draw Call优化,如创建100个相同的游戏对象,则只会调用一次Draw Call。但动态批处理有很多约束条件,如只支持小于900顶点网格物体,材质不同不行,不能使用缩放等

物理组件的优化
  • 设置合适的Fixed TimeStep,这个指标指进行一次物理计算的时间。当时间太短的话,计算频率会很高,浪费CPU的开销。所以选择一个合适的值很重要。
  • 尽量不要使用网格碰撞器,因为它太过于复杂了,性价比不高。
优化GC
  • 字符串连接处理,将两个字符串连接的过程会将之前旧字符串丢弃,需要GC来处理,这无疑是一种浪费
  • 尽量不要使用foreach,而用for语句。因为foreach会涉及到迭代器的使用,而一次循环所产生的迭代器会带来24Bytes的垃圾。
  • 不要直接访问gameobject的tag属性,比如if(go.tag == "human") 最好换成if(go.CompareTag("human")) 因为访问物体的tag会在堆上产生额外的分配空间。
  • 最好使用对象池,以实现空间的重复利用
  • 最好不要用LINQ命令
代码优化
  • 以物体Transform组件为例,我们应该只访问一次,之后就将它的引用保留。
  • 最好不要用GetComponent,开销很大
  • 对于在摄像机中不会出现的物体,善于运用OnBecameVisible和OnBecameInvisible来控制物体的update()函数的执行
  • 使用内建的数组,比如用Vector.zero而不是new Vector(0, 0, 0)
  • 对于值类型,善于运用ref关键字,进行引用的传递而非值传递
其他
  • 将纹理打包成图集尽量减少材质的使用
  • 尽量少的使用反光、阴影之类的效果,那样会使物体多次渲染

GPU优化

减少绘制数目
  • 使用纹理图集
  • 使用光照纹理而非实时灯光
  • 使用LOD
  • 遮挡剔除
优化显存带宽
  • OpenGL ES 2.0 使用 ETC1格式
  • 使用mipmap

内存优化

  • Unity3D的内部内存,主要处理各种资源,如纹理,网格,音频,物理系统,粒子系统,GameObject等
  • Mono的托管内存,针对Mono的GC
  • 第三方DLL所需要的内存

参考

Unity3D脚本编程—-使用C#语言开发跨平台游戏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值