Unity优化总结

21 篇文章 0 订阅

一、纹理压缩格式

    非GPU支持的纹理格式,需要经过CPU解码;而GPU支持的纹理格式,GPU直接解码和显示,GPU的解码有很多优化,随机访问、快速寻址和并行解码等,因此效率高得多。而且,压缩过的纹理文件通常更小,比如ETC1是8:1的压缩比,文件小就意味着加载更快,更节约系统带宽。在手机上对比测试一下加载一个1MB的文件和一个8MB文件的耗时吧。

    在ios设备上,请使用PVR格式。wp8和win8设备上,DXT格式。android设备,不透明贴图选择通用支持的ETC1格式;而透明贴图,4大GPU厂商各自有自己的压缩格式,可以把贴图分成一张RGB图和一张alpha通道图,都用ETC1格式,游戏里再合成;也可以简单选择RGBA4444格式。

    实测效果:显著提高渲染表现。我第一次打wp8包在lumia 520上运行,比较卡,声音有卡顿;改纹理压缩格式为DXT1/DXT5之后,在lumia 520上运行比较流畅,声音卡顿现象也没有了。

    另外,贴图建议做成方形的,一般不要超过1024x1024。我们最初在lumia 520上偶尔有纹理丢失现象,后来我把几个2048的贴图拆成1024x1024的,问题再也没有出现过,原因没搞明白,知道的朋友朋友请不吝赐教。

2. 限帧

    在移动设备上,Unity默认是60帧/秒,建议关掉垂直同步,把FPS限为30,进入后台时为1。限帧可以显著的减少发热和耗电。

3. 图集/材质/Mesh合并

    我仅仅通过优化图集,就将游戏的内存占用降低了30M。而且,因为DrawCall减少了,游戏中一个比较复杂的关卡列表界面,渲染耗时减少了一半。

4. 资源优化

    我们的战斗场景是3D的,我测试的时候发现这个3D场景渲染表现很差,打开战斗场景,在Galaxy S4上竟然只有35FPS左右!要命的是我们没有美术,美术都是外包的,外包那边的同学不懂移动平台的优化。我找了一些美术优化的文章发给他,估计他也没看懂,他改了几次,渲染表现没有任何改善。最后只能我自己上阵了,我看不懂那些种类繁多的美术资源,采用最笨的二分法,最后查到一个水花溅起的烟雾(Fog)效果是性能瓶颈。这个效果的表现力很弱,跟产品、策划和美术商量之后把这个效果关闭了。然后,比S4配置差很多的手机也能跑满60FPS了。

5. 脚本优化

    很多时候,性能瓶颈点不在于渲染,而是脚本代码!我们要删除脚本中为空或不需要的默认方法,尽量少在Update中做事情,脚本不用时把它deactive。

    经过以上五步优化之后,在lumia 520,iphone 4和三星9100上测试,游戏都可以达到60FPS,满足了上线需求。但是,因为战斗场景元素最多,渲染表现最差,而且玩家在战斗场景中的时间最长,我后面又针对战斗做了一些优化。

6. 资源卸载、垃圾回收

   策划的同学反馈过,战斗的时候,偶尔会卡顿。观察发现,是有规律的定时卡顿,针对加载的Assets,我们每30秒自动进行一次资源卸载(UnloadUnusedAssets),有时还会触发垃圾收集(GC.Collect)。改为进、出战场时卸载未被引用的资源,而战斗中不再定时卸载,解决了偶尔卡顿的问题。

7. 资源预加载

    以空间换时间的方法。创建一张新卡牌或特效时,掉帧明显,改为进入战场时,预加载卡牌和技能特效资源,效果很好。

8. 优化战斗卡牌渲染

    经过前面那些优化之后,我仍然不满足,一直在寻求继续的优化,让玩家的战斗体验可以更好。

    我们战斗时DrawCall能达到120个左右,我一直在考虑怎么降低DrawCall,3D场景占了20多个,这块没法优化了(没有美术啊%>_<%)。我就把目光盯向卡牌,战场上最多可以有20张卡牌,所以,卡牌是DrawCall的“贡献大户”。先问问策划,卡牌上是否有可以不显示或者合并的内容,策划的同学们寸步不让。吃了闭门羹,只能回来自己琢磨,后来终于想到,显示的内容我无法减少,但是我可以把所有的内容渲染到一起,这样以后绘制时只需要绘制渲染出的纹理而不需要绘制卡牌上“零散”的内容。

    卡牌上有卡像、卡框、种族、等级、名字、等级、攻/防等,贡献了5~6个DrawCall,而这些内容除了攻/防数字,别的内容在战斗时都不会改变,把他们渲到一张新纹理上,DrawCall就只有2个了:新纹理和攻/防数字!ps: 攻/防数字也可以和别的内容渲染到一起,相对游戏的帧率,数字改变并不算频繁,每次数字改变重新绘制并不会带来显著的开销。

    想明白之后,实现就很简单了。然后,分别打了wp8、ios和android包在相应设备上测试。测试结果:DrawCall降低了一半,帧数提高到了原来的2倍。而且,之前一直未较好解决的发热问题,完全解决了。在战场中打了30多分钟,lumia 520、Galaxy S4和iPhone 4s微微温,iPod Touch5没有发温。对比了一下当前正火的《刀塔传奇》,完胜:-D。

    

    从上面的对比图可以看到,渲染优化之后,虽然卡牌更多,但是FPS仍然提升了近一倍,优化的效果非常好。卡牌越多,优化的效果会越显著。

9. 优化NGUI

    NGUI有些地方效率很低。

    1). 动画。如果有动画,NGUI可能会重建动画控件所在的整个UIPanel的DrawCall,对CPU开销很大。所以,如果有动画控件,一定要把它单独挂到一个UIPanel下。

    2). 锚点。UIAnchor每一帧就重算位置信息,so foolish!只需要初始化和窗口大小变化的时候计算就好(对于移动游戏窗口大小不会变化^_^)。

    3). 列表。NGUI列表(UIGrid+UIDragablePanel, ver2.6)如果放子item较多,会非常卡,比如你加了100个好友/有100张卡牌,不仅掉帧厉害,拖动的时候也非常卡。可以根据显示需要,创建出显示个数+x个子item,循环重复利用。通讯类app比如微信、QQ、通讯录应该都是这么优化的。

    4). 其它。可以在一些性能瓶颈点用Unity原生方式实现,代替使用NGUI。我们的主场景是可拖动的长条形地图,最开始做的同学直接用NGUI列表来做,后来我测试发现这里是严重的性能瓶颈,改用Unity SpriteRenderer实现,根据需要自己做拖动、点击(不规则地图,多边形碰撞盒),效率提升非常明显。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值