我们的游戏已经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. 2015华为德州扑克入境摘要——软体project

    直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...

  2. VS2010程序打包操作

    摘录:http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html   1.  在vs2010 选择“新建项目”----“其他项目类型”-- ...

  3. oralce 获取自定义主键编码,有并发问题

    F_GET_SEQUENCE,功能函数,当多个服务同时调用此函数,可能产生并发问题,待解决,加主键. CREATE OR REPLACE Function f_Get_Sequence(As_Comp ...

  4. JavaHTTP下载视频

    控制层类: package com.grab.video.controller; import java.io.BufferedOutputStream; import java.io.Buffere ...

  5. Datatable转换为Json 然后,Json数据导入 js 档

    C#在里面Datatable转换为Json的5代码示例 /// <summary> /// Datatable转换为Json /// </summary> /// <pa ...

  6. HDU 1698 Just a Hook (段树更新间隔)

    Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing for m ...

  7. DataGridView显示数据的两种方法

    1.简介 DataGridView空间是我们经常使用的显示数据的控件,它有极高的可配置性和可扩展性. 2.显示数据 DataGridView显示数据一般我们经常使用的有两种方法,一种是直接设置Data ...

  8. 国内外MD5在线解密网站

    -http://www.cmd5.com/english.aspx (457,354,352,282) - http://www.md5crack.com - http://www.hashcheck ...

  9. JavaScript IDE

    哪些JavaScript IDE最好用?   阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最高,占比达到42.84%,因此掌握JavaScript语言好工作就不愁啦,工欲善其 ...

  10. Windows 8实例教程系列 - 数据绑定基础实例

    原文:Windows 8实例教程系列 - 数据绑定基础实例 数据绑定是WPF,Silverlight以及Windows Phone应用开发中最为常用的开发技术,在基于XAML的Windows Stor ...