Unity优化总结

21 篇文章 1 订阅
2 篇文章 0 订阅

    我们的游戏已经在wp8、ios和android平台上线了。这是我做的第一个Unity项目,期间遇到过不少困难和挫折,但是我和小伙伴们一路摸索,现在,游戏已经上线一段时间,并且很稳定。对于Unity,我一直在项目中学习,我会写一系列的文章记录自己的学习,欢迎看到文章的朋友多多交流。

    项目中后期,我做了一些优化工作,这里记录总结一下。

一、纹理压缩格式

    非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实现,根据需要自己做拖动、点击(不规则地图,多边形碰撞盒),效率提升非常明显。

    以上就是我在做我们的项目时,摸索出的适合我们游戏的一些Unity优化方案。因为我们的游戏是2D的,所以可能对于3D游戏的优化,有些方案可能并不适用,也不够全面。目前有些地方,我们做的也不是很好,优化是一项长期、持续的工作,后面我还会一直进行下去。

 

    另外,我翻译了最新版的Unity官方文档:图形性能优化,从原理和方法上讲了图形优化,非常实用。

    下一篇文章预告:Unity自动打包工具,可以一键生成几十个平台/渠道的安装包。

    转载请注明出处: http://blog.csdn.net/ynnmnm/article/details/36759789。作者:夜风。

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
Unity是一种用于创建3D和2D游戏的跨平台游戏引擎。机械结构是指由不同部件组成的机械装置或机械系统。Unity机械结构是指使用Unity引擎进行机械结构模拟和仿真的能力和方法。 使用Unity进行机械结构建模和仿真可以带来很多好处。首先,Unity具有强大的3D建模能力,可以方便地创建各种机械部件和装置的模型,并对其进行渲染和显示。这使得工程师能够通过虚拟实验来评估机械结构的性能和可靠性,而无需进行实际的物理实验。这样可以节省时间和成本,并提高设计的效率。 其次,Unity具有物理引擎,可以模拟和仿真机械结构的行为。例如,工程师可以通过在Unity中设置物体的质量、碰撞形状和力的作用方式等参数,来模拟机械结构的运动和相互作用。这使得工程师能够更好地理解机械结构的行为,并进行优化和改进。 此外,Unity还具有编程和脚本功能,可以用于控制和自动化机械结构的运行。工程师可以使用C#或Unity脚本语言编写程序,来实现机械结构的运动控制、路径规划和逻辑控制等功能。这使得工程师能够更灵活地控制机械结构,并实现更复杂的功能。 总结起来,Unity机械结构是指利用Unity引擎进行机械结构建模和仿真的能力和方法。通过使用Unity,工程师可以快速创建机械结构模型、进行仿真分析、优化设计,并实现控制和自动化。这将提高机械结构设计的效率和精度,并为工程师提供更多创新和优化的可能性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值