我们的游戏已经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。笔者:夜风。

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

Unity最优化摘要的更多相关文章

  1. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  2. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  3. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  4. Unity中无GC Alloc的CalculateFrustumPlanes

    如果你需要在逻辑层做一些预先的剔除操作,可能需要从MainCamera构建视锥体,然后进行简易相交测试,这时候在unity里面用到的函数接口是CalculateFrustumPlanes: names ...

  5. Unity依赖注入使用详解

    写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...

  6. 如何正确的使用Lerp In Unity

    摘要 本文探讨如何用lerp实现近似的匀速旋转,当然如果运用本文给出的方法,使用slerp则可以实现匀速旋转,并指出Unity官方lerp示例代码的一些缺陷. 现有问题 比如四元数Lerp API: ...

  7. 转Unity 异常操作

    摘要 使用 unity 处理异常的方法可能会与你的直觉不符.本文将给出正确的处理方法,并简单剖析Unity这部分源代码. 处理异常 打算用Unity的AOP截获未处理的异常,然后写个日志什么的,于是我 ...

  8. 关于 Unity NavMesh 数据的导出和使用

    上周的工作重点转移到服务器寻路上来,刚刚做完没几天,总结一下,当时团队讨论的结果是使用 Unity 原生的 NavMesh 系统,然后将数据导出到服务器使用.我最初的思路是将导出的网格加载到服务器后, ...

  9. unity 播放外部视频

    摘要: Unity支持的播放视频格式有.mov..mpg..mpeg..mp4..avi和.asf.只需将对应的视频文件拖拽入Project视图即可,它会自动生成对应的MovieTexture对象. ...

随机推荐

  1. Python多线程的threading Event

    Python threading模块提供Event对象用于线程间通信.它提供了一组.拆除.等待用于线程间通信的其他方法. event它是沟通中最简单的一个过程之中,一个线程产生一个信号,号.Pytho ...

  2. Gradle第二步骤来创建学习Task

    请下载本系列中的以下文章Github演示示例代码: git clone https://github.com/davenkin/gradle-learning.git     Gradle的Proje ...

  3. Android TextView里直接显示图片的三种方法

    方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般假设字体是在图片上重叠的推荐这样写.时间关系,这个不付源代码了. 方法二:利用Tex ...

  4. ios ios7 取消控制拉升

    //推断是否ios7 取消控制拉升 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) { self.edgesFo ...

  5. 小米2S twrp 中文,支持双系统

    更新日志: 更新日志: 汉化了要使用的功能 修改语言选择方式,修改为下拉方式 TDB(TrueDualBoot) 功能完美实现 **adb**功能,完美实现,无需特别操作(比CWM强大) 修改双系统切 ...

  6. CentOS 安装apache 及所需的 apr,apr-util,pcre

    安装apache前确定已安装 apr,apr-util,pcre 一.安装apr [root@xt test]# tar -zxf apr-1.4.5.tar.gz [root@xt test]# c ...

  7. CSAPP 六个重要的实验 lab5

    CSAPP  && lab5 实验指导书: http://download.csdn.net/detail/u011368821/7951657 实验材料: http://downlo ...

  8. 解决iOS app集成共享QQ场地,微信的朋友,朋友等功能圈,不能采用苹果公司的审计问题

    最近提交的应用程序App Store时刻,由于App综合QQ登录.份额QQ场地.微信等功能.被拒绝.很郁闷:在最佳.想想办法,这个问题是可以解决. 当共享平台列表显示.根据推断当前设备被安装在一节Ap ...

  9. 应用层协议系列(两)——HTTPserver之http协议分析

    上一篇文章<抄nginx Httpserver设计与实现(一)--多进程和多通道IO现>中实现了一个仿照nginx的支持高并发的server.但仅仅是实现了port监听和数据接收.并没有实 ...

  10. Ural 1309 Dispute (递归)

    意甲冠军: 给你一个数列: f(0) = 0 f(n) = g(n,f(n-1)) g(x,y) = ((y-1)*x^5+x^3-xy+3x+7y)%9973 让你求f(n)  n <= 1e ...