Unity开发Android应用优化指南(上)
http://forum.china.unity3d.com/thread-27037-1-2.html
如今越来越多的开发者使用Unity开发Android及iOS项目,开发过程中难免会遇到一些性能方面的问题,例如掉帧、延迟和卡顿等等,导致游戏体验变差甚至毫无游戏体验可言。今天这篇文章将由Niels Tiercelin,为大家深入剖析Unity项目优化过程。
游戏性能分析
Unity Profiler
建议使用Unity Profiler工具(Window > Profiler)来分析项目性能,该工具以图形化的方式呈现游戏具体的行为、计算所需的时间以及每帧渲染的时长等等,包含所有可能会影响性能的数据。
使用该工具非常简单,只需点击图表本身(例如点击图表中的某个高峰)就可以查看该帧的详细计算数据。Unity会显示耗时最长的处理步骤。如果并不理解其中某个处理步骤的意义,也很容易在网上搜索来查找相关内容。
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195541wqm5zp55xryx65pe.jpg.thumb.jpg)
Unity Profiler 本身在编辑器环境下运行,并展示游戏运行的细节,但请注意,这里并不能反映出游戏的真实性能。由于Unity编辑器需要处理游戏本身以及额外的内容,因此此时的游戏运行速度会比构建之后的游戏慢一些。
Remote Profiler
使用Unity Profiler无法得知游戏运行的真实性能,所以需要在设备上运行游戏并进行分析。下面以Android设备为例,配置Android
SDK和JDK后构建项目,然后就可以开始使用Remote Profiler了。
在Build Settings中(File > Build Settings)同时勾选 “Development Build” 和 “Autoconnect Profiler”,并确保 Editor Settings 设置中的 “Device” 一栏为 “Any Android Device”。
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195558ytjk8fft5wtw444u.jpg.thumb.jpg)
现在将设备连接到计算机并运行游戏。正常情况下Unity中会出现Profiler窗口,显示设备的运行状态。如果Profiler窗口未出现,则打开Profiler窗口,在 “Active Profiler” 下拉菜单中选择类似 “AndroidPlayer(ADB…)” 的条目,这个一般就是您的设备。
直接对设备本身进行分析可以更精确地获取游戏的性能数据,因此优先考虑这种方法。
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195640rm0ut9m0u09u230o.jpg.thumb.jpg)
选择设备作为“Active Profiler”
编辑器日志
另一种获取信息的方式是编辑器日志。游戏构建完毕后立刻打开Console窗口(Window > Console),在窗口的右上方有一个按钮,点击后选择 “Open Editor Log”。
此时系统会打开一个文档,其中包含很多构建相关的信息,特别是构建文件的大小以及资源占据的空间等。
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195737punwc6rcbzrirxz1.jpg.thumb.jpg)
在不同设备上进行测试
Android开发相当复杂,可能会出现很多问题。因为某个性能问题可能仅在某些设备上出现,而在另外一些设备上完全不是问题。因此应该在不同设备上测试游戏,从而避免此类问题,保证您的游戏能够在绝大多数设备上正常运行。
虽然等到项目开发后期再做优化这种想法很常见,但此时的性能问题可能已堆积成山。因此最好的做法是周期性地检测游戏,例如在每个里程碑达成时进行性能分析。这样随着游戏不断修改,需要进行的优化工作也会越来越少,也能越来越快地找到性能瓶颈所在。
脚本
搞定渲染优化这个大目标之前,应该先保证脚本不会出现问题。如果您是程序员,最好在把锅甩给美术之前先检查一下脚本是否有性能问题(哪怕真的是美术的锅!)
慎用Update
Unity初学者通常最大的误解在于过于依赖Update()函数。将所有内容都塞到Update()中确实是最容易的做法,例如检查某个状态并根据状态做出相应动作等,但如果场景中的每个GameObject都要在Update()里检查非常多的东西或进行复杂操作,就会大大影响游戏性能。
所以,在使用Update()之前,首先问一问自己,要实现的功能真的需要逐帧运行吗?
使用协程
如果不是必须逐帧运行,还可选择其他几种方式来实现。例如,可以利用协程(Coroutines)让某个方法每秒钟运行一次:“yield return new WaitForSeconds (1);”
可以用下面的方法刷新UI:
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195812w6doqledwqaoal4o.jpg.thumb.jpg)
还可以每两帧调用一次方法来进行某种复杂计算,如下:
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195848t2m5arjtvjsmwjsj.jpg.thumb.jpg)
善用Events、Actions,响应式编程(Reactive Programming)
调用方法真正高效地方式是仅在需要时调用。例如当某个变量改变时、某个方法被调用时,或者某个事件发生并弹出UI菜单时等等。这就是响应式编程的基本原理,即利用Events,对某个事件作出反应。
在C#中您可以使用委托,尤其是Action委托,来创建事件。当事件发生时调用某个函数,然后由该函数去调用订阅了该事件的方法。
例如,创建 “玩家跳跃”事件,在代码中每当玩家跳跃时就会发起这个事件。例如某个方法生成了一些灰尘效果或者播放跳跃音效,将该方法订阅到“玩家跳跃”这个事件上,玩家跳起来时就会调用生成灰尘效果播放音效的方法。这仅仅是一种简单的应用,您还可以深入探究。
如果您对响应式编程有兴趣,可以参考UniRx
- Reactive Extensions插件。这是为Unity设计的响应式编程拓展,支持LINQ异步及多线程、LINQ订阅到事件等等。
利用射线检测可触摸GameObject
在Unity中,除了UI之外并没有什么比较容易的办法来检测某个GameObject在屏幕上的点击。OnMouseDown() 函数对于移动平台并不生效。一种可行的方案是使用射线。从摄像机出发,以屏幕上手指点击的位置为方向。如果射线检测到某个对象则调用该对象的方法。
可以先定义一个Touchable类,一个Touchable层。触摸到某个对象时则调用下面的方法:
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195908i599sffx7558m5n8.jpg.thumb.jpg)
如果检测到触摸操作作用在带有Touchable的游戏对象上,则调用该对象的OnTouchDown()方法。
物理
检查脚本时一定要检查物理交互相关的代码(如果存在)。当然,移动设备上最好不要有此类代码,但如果无法避免,应特别注意以下几点:
动态刚体(Rigidbody)的数量越少越好,它们会大量消耗计算性能。
使用基础碰撞体,避免使用网格碰撞体,后者的计算处理要复杂得多。
尽量将“Collision Detection Mode” 设置为 “Discrete”,因为 “Dynamic” 会用掉更多的性能。
最后,可以在TimeManager窗口(Edit > Project Settings > Time)中设置 “Fixed Timestep” 的值。这个值表示两次FixedUpdate()调用之间的时间间隔。
![](http://forum.china.unity3d.com/data/attachment/forum/201709/03/195925cc7byzypk172yebk.jpg.thumb.jpg)
所以Fixed Timestep值越小表示函数调用越频繁,从而获得更精确的模拟计算结果,代价则是消耗更多的资源。反之,该值越大越能降低处理物理相关数据所占用的时间,如果不需要特别精确的计算结果这也是一个很好的选择。
总结
以上就是Niels从刚做完的Android项目中学到的经验,并将其总结在这篇文章里,以帮助其他更多的Unity开发者。优化通常需要花费大量时间来寻找性能瓶颈并进行测试,希望这篇文章对正在使用Unity进行开发的朋友们有帮助。我们还会分享一些Unity项目制作及优化经验在Unity官方中文社区(unitychina.cn),请保持关注!
Unity开发Android应用优化指南(上)的更多相关文章
- Unity开发Android应用优化指南(下)
http://forum.china.unity3d.com/thread-27044-1-1.html 在Unity开发Android应用优化指南(上)一文中,从游戏性能,脚本等方面进行了分析和总结 ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- unity开发android游戏(一)搭建Unity安卓开发环境
unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...
- unity开发android游戏
环境搭建: Unity+JDK+Android Studio+Android SDK(+NDK) 教程:unity开发android游戏(一)搭建Unity安卓开发环境 注意“Build System ...
- 【转】unity开发android游戏(一)搭建Unity安卓开发环境
http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...
- Android图片优化指南
图片作为内存消耗大户,一直是开发人员尝试优化的重点对象.Bitmap的内存从3.0以前的位于native,到后来改成jvm,再到8.0又改回到native.fresco花费很多精力在5.0系统之前把B ...
- 使用Unity开发Android的几种调试方法
前言 本文举例几种Android 调试的方法(PS:我是通过unity引擎来开发安卓游戏) Eclipse + adt 查看LOG 1.为Eclipse 装上adt 插件 2.打开Eclipse 的L ...
- Unity编译Android的原理解析和apk打包分析
作者介绍:张坤 最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用Android的部分原理进 ...
- 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分
原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...
随机推荐
- python cookbook第三版学习笔记四:文本以及字符串令牌解析
文本处理: 假设你存在一个目录,下面存在各种形式的文件,有txt,csv等等.如果你只想找到其中一种或多种格式的文件并打开该如何办呢.首先肯定是要找到满足条件的文件,然后进行路径合并在一一打开. pa ...
- CUDA: 流
1. 页锁定主机内存 c库函数malloc()分配标准的,可分页(Pagable)的内存,cudaHostAlloc()分配页锁定的主机内存.页锁定内存也称为固定内存(Pinned Memory)或者 ...
- Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...
- pinpoint本地开发-web模块
web模块中的前端依赖会导致工程很难打包成功,对于这些,我们可以直接注释掉 比如: <plugin> <groupId>com.github.eirslett</grou ...
- 小程序开发之xxx is not defined
遇到问题 在小程序开发中直接在函数中调用data中的变量直接赋值给新的变量,就会出现如下错误 VM33895:1 thirdScriptErrorapaymoney is not defined; [ ...
- python的easygui
1.利用msgbox(单词messagebox的缩写)给出一个提示信息: import easygui as g reply=g.msgbox('This is a basic message box ...
- 假日旅游CSS网页模板
假日旅游CSS3网页模板,蓝色,旅游,假日,公司,设计,主页,HTML,DIV+CSS,模板下载. http://www.huiyi8.com/lvyoumuban/css/
- L83
Kids Gulp 7 Trillion Calories Per Year Kids from the ages of 2 to 19, consume about seven trillion c ...
- Dat.gui 使用教程
官方站点:http://workshop.chromeexperiments.com/examples/gui/ Dat.gui 使用教程:Dat.gui 是一个 GUI 组件,他可以为你的 demo ...
- kettle 设置变量
以下只是本人在使用过程中一些经验,可能有误解不对的地方,希望大家指正. 这个控件可以在job中调用,也可以在transformation中使用.下面将分别说明在两个不同任务中调用时的使用方法和需要注意 ...