博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity最优化摘要
阅读量:5167 次
发布时间:2019-06-13

本文共 2555 字,大约阅读时间需要 8 分钟。

    我们的游戏已经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游戏的优化,有些方案可能并不适用,也不够全面。

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

    另外,我翻译了最新版的。从原理和方法上讲了图形优化。很有用。

    下一篇文章预告:。能够一键生成几十个平台/渠道的安装包。

    转载请注明出处: 。笔者:夜风。

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

转载于:https://www.cnblogs.com/mfrbuaa/p/4623631.html

你可能感兴趣的文章
后端接口时间戳或者随机数的作用
查看>>
IOS越狱环境搭建
查看>>
tomcat docBase 和 path
查看>>
jQuery代码性能小细节
查看>>
java默认语法、EL、JSTL表达式,JSTL和struts Tag标签的使用总结
查看>>
复杂度分析
查看>>
Vue笔记:使用 axios 发送请求
查看>>
利用反射动态调用类成员
查看>>
富文本编辑器 - RichEditor
查看>>
LintCode刷题笔记-- Count1 binary
查看>>
java webcontroller访问时报415错误
查看>>
qcow2、raw、vmdk等镜像格式
查看>>
.NET:CLR via C# Assembly Loading
查看>>
wed开发基础--练习题
查看>>
CentOS安装rar及用法
查看>>
TYVJ-P1864 守卫者的挑战 题解
查看>>
Jzoj5455【NOIP2017提高A组冲刺11.6】拆网线
查看>>
特定字符序列的判断(1028)
查看>>
记一次报错信息
查看>>
判断数组内是否有几个元素之和等于m
查看>>