• Unity最优化摘要


        我们的游戏已经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: 攻/防数字也能够和别的内容渲染到一起,相对游戏的帧率,数字改变并不算频繁,每次数字改变又一次绘制并不会带来显著的开销。

        想明确之后,实现就非常easy了。然后,分别打了wp8、ios和android包在对应设备上測试。測试结果:DrawCall减少了一半,帧数提高到了原来的2倍。并且。之前一直未较好解决的发热问题,全然攻克了。

    在战场中打了30多分钟。lumia 520、Galaxy S4和iPhone 4s微微温,iPod Touch5没有发温。

    对照了一下当前正火的《刀塔传奇》。完胜:-D。

        

        从上面的对照图能够看到,渲染优化之后。尽管卡牌很多其它。可是FPS仍然提升了近一倍,优化的效果很好。卡牌越多。优化的效果会越显著。

        以上就是我在做我们的项目时,摸索出的适合我们游戏的一些Unity优化方案。由于我们的游戏是2D的,所以可能对于3D游戏的优化,有些方案可能并不适用,也不够全面。

    眼下有些地方,我们做的也不是非常好,优化是一项长期、持续的工作,后面我还会一直进行下去。


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

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

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


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Microsoft SQL Server 自定义函数整理大全 [转]
    eclipse将android项目生成apk并且给apk签名
    Android实现对图片的缩放、剪切、旋转、存储
    Android 之 ProgressDialog用法介绍
    Android中Path类的lineTo方法和quadTo方法画线的区别
    Android仿微信二维码扫描
    Android中Bitmap,byte[],Drawable相互转化
    hibernate基础之无法自动创建表总结
    Android获取短信验证码
    Android之常见问题集锦Ⅰ
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4623631.html
Copyright © 2020-2023  润新知