Unity3D 5 优化经验汇总

发表于2016-11-11
评论1 4.9k浏览
 unity 5优化的个人浅见
  卷首语:笔者水平一般,只是重在参与,如有错漏希望见笑。
  针对 unity 5.4.2 f 2 (64-bit)版本
  很喜欢同事“”熊大“”的一句话:优化是针对卡顿点的优化。
  但是很多时候我们往往可以从一些细节做起

1、Prefabs(预设)与 Instantiate(实例化)
  解:如果场景中有多个重复的内容,就可以设成一个Prefabs(预设),它是一种资源类型,可被重复使用的游戏对象。
  例如:千军万马,很多树,一模一样的汽车


2、对象集合的概念
  为了减少频繁增删Prefabs(预设)  Object集合的概念提出,可以在一些复用场景需要频繁增删的时候减少代码操作,(new/delete)来创建、销毁
  一般建议在比较复杂的场景中使用。
  美术相关的优化:除了改变模型大小,减面,减少纹理尺寸外,
  举一些在我们的项目中采用的方法和走过的弯路:
1)、美术极端做法:不用像素光(pixelsLights),不用阴影(No Shadows),没有追灯,没有实施阴影,阴影可以用面来代替,不用实时灯光, 用lightmap代替,不打灯光烘培,全靠贴图。(结论:不适合3D游戏,效果真心一般。)

例 2D 游戏的做法

2)、多个模型选择做法,根据led分别调用(角色展示窗2万面,场景人物5000面,远景只有几百面)(结论:这是以牺牲美术为代价,会造成包变的很大)
3)、程序极端做法:让程序用着色器来写贴图和特效 (结论:程序极端做法不适用于大项目)
4)、使用遮挡剔除插件,笔者用的是老版本Occlusion Culling ,Simplygon(裁面插件)其作用是,自动将
  视锥体剔除(Frustum Culling)
  遮挡剔除(Occlusion Culling)
  简言之就是全自动将你看不到的东西不再绘制,插件会把相同材质的分为一组(一个Batch),然后把它们组合成一个物体(统一变换),这样就可以在一个Draw Call中处理多个物体了(实际上是组合后的一个物体)当我们的描绘指令draw call越少,自然性能越高。
5)、美术规则的约定,卡通1500面就可以提现人物细节,写实5000面打住,控制人物的骨骼。减少粒子发射器,禁用粒子碰撞。美术总要前期约定好,不然后面就要砍砍砍,最最重要的是美术规格,一般团队的做法是把所有的贴图放在一起一张比较大的图片上,用工具整合起来。
  (结论:各种参数一定要在前期商量好,美术后期减面很痛苦。)


6)、非运动物体尽量打上 Static 标签
  Unity 在运行时会对 static 物体进行自动优化处理,所以应该尽可能将非运行实体勾上 static 标签。


关于程序的优化
1、物理优化是一个老大难
  一般情况下,物理尽可能使用Sphere Coillider、Box Coillider等,尽量避免使用Meh Colllider等。渲染设置,避免使用Alpha Test,因为非常耗时,性价比很低。关于Sttic Batching,对静态物体进行Batch,对几何数据的大小没有限制。(这个结论出自,U3D4.3做某3D项目时)
2、我们在实际的工作过程中,碰到了很多很多问题,例如: JIT编译,Shader编译,骨骼拼装,物理运算,Animator运算,实时合并Mesh,很挫的代码接口,文件操作,资源同步加载,NGUI激活,DC太多,面数太多,NGUI,shader运算,代码运算量过大,等等,在项目的过程中我们也找到了办法,但是大部分的方法网上都有现成的资料,作为比赛的庄重性和原创性,我就不照搬了,希望大家可以体谅。谢谢!
  还是借用同事的那句话,针对卡顿进行优化,profile 看下消耗不就知道哪里耗了,然后就去解决吧。


  最有用的做法:

策划少提一些难落地的需求
  例如:策划说,我要一个模型15000面,可以换装,带武器,带宝宝,场景效果要牛逼,还要实施光影,要万人国战,时时同步,为了配合玩法至少显示自己周围50个人包括他的时装特效。
  最后我很感谢GAD的比赛,让我整理了一下思路,通过询问同事,了解了很多原本我不知道的内容,谢谢!

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引