UNITY3d在移动设备上的一些优化实战(一)-概述

项目进入了中期之后,就需要对程序在移动设备上的表现做分析评估和针对性的优化了,首先前期做优化,很多瓶颈没表现出来,能做的东西不多,而且很多指标会凭预想,如果太后期做优化又会太晚,到时发现一些问题改起来返工量就有太大。前一阵子花了大量时间从 cpu gpu 内存 启动时间 到发热量对项目做了一翻大规模的体检和优化,效果还是显著的,在这里做个笔记,以后开发项目时可以作为经验和提前关注

1.项目情况:笔者所在项目是一个非常重度的手游,甚至开始就是瞄着端游做的,3D世界,2.5D视角,RPG,即使战斗,美术品质要求极高(模型 贴图精度高 ,超过目前市场同类产品)。对于目前大多数移动设备来看,挑战不小,对手机的各种硬件都是挑战。、

2.目标机型:偏中高端,尽量兼容低端,android至少sumsung S3能流畅,ios至少iphone4s流畅。

3.性能指标:内存占用250M以下(这样大量512的机器不会挂掉),初始包100m之内(太多运营不干,太少实在是装不下。。)

用于分析和测试性能的一些利器:

1.首先是unity在编辑器下的statics窗口:提供了dc和顶点数这两个重要指标的查看。缺点在设备看不到,但是对于dc数和顶点数来说,设备和编辑器差不多,用它可以大体看出渲染的压力。

2.unity自带的profiler:可以连接设备看到设备上cpu gpu mem的信息,使用的时候需要勾选development模式。有点是cpu的占用在脚本的层面看的非常仔细,哪个函数占用了太多时间一眼就能看出,基本是分析脚本效率的最佳工具,但是gpu大部分设备不支持看不到,显示的mem信息不太准确,基本上偏离实际占用的内存

3.unity的internal profiler:在playersetting上可以勾选这个选项,勾选后,连接设备,在android的adb或者mac的xcode里会每隔几秒打印出很多关键指标,这个其实非常有用,不过这个功能直到很后期才发现,详细文档见http://docs.unity3d.com/Manual/iphone-InternalProfiler.html

4.android上的adb:adb提供了一组非常强大的分离android程序的工具,http://developer.android.com/tools/help/adb.html

而最常用的是用adb的dumpsys 指令,https://source.android.com/devices/tech/input/dumpsys.html

最常见的包括: adb shell dumpsys meminfo appname  查看实时的内存占用,android的内存分为ps rs,我们一般看ps为准,关于ps rs这些概念可参看http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android

adb shell dumpsys cpuinfo appname 查看实时的cpu占用,注意这里的cpu可能过百,这是因为多核的原因

adb shell dumpsys gpuinfo appname 查看实时的gpu情况

5.android  的monitor

安装adt后,在sdk\tools\monitor.bat下面有个monitor,是我认为android看性能最好的工具之一,因为它是图形化的,而且基本集成了adb的功能,从内存到cpu到gpu,还有很有用的网络流量使用情况,它的cpu占用是c++层面的统计,看不到脚本,这需要突破那个profilor结合。

6.android上的mongkey测试:它可以模拟随机的用户输入,用来验证你的程序的强壮性吧

adb shell monkey -p -v packname 1000

随机模拟1000条用户事件

7.ios:ios上的工具则显得更加专业更加统一一些,ios就用xcode自带的instruments了

这里有个详细的文档https://developer.apple.com/library/mac/documentation/developertools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html

看来这么多工具,其实很多是要配合使用的,做u3d开发,其实不只是学会U3D的事情,要让U3D在手机上运行的好,还需要对各个平台有较深的了解。

利用这些工具法线了一些瓶颈,同时也采取了各种策略来提高性能,反正目标就是cpu占用降低,内存占用减少,启动快,发热小,帧率高,GPU占用少,发现的一些问题和做出的具体的一些努力列举如下:

1.使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新

2.顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右

3.只使用一盏动态光,不是用阴影,不使用光照探头

粒子系统是cpu上的大头

4.剪裁粒子系统

5.合并同时出现的粒子系统

6.自己实现轻量级的粒子系统

animator也是一个效率奇差的地方

7.把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下

8.animator出视野不更新

9.删除无意义的animator

10.animator的初始化很耗时(粒子上能不能尽量不用animator)

11.除主角外都不要跟骨骼运动apply root motion

12.绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动

NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下

13每帧递归的计算finalalpha改为只有初始化和变动时计算

14去掉法线计算

15不要每帧计算viewsize 和windowsize

16filldrawcall时构建顶点缓存使用array.copy

17.代码剪裁:使用strip level ,使用.net2.0 subset

18.尽量减少smooth group

19.给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具

后面的文章会对这些点做以更详细的讨论

时间: 2024-10-22 19:37:28

UNITY3d在移动设备上的一些优化实战(一)-概述的相关文章

在移动设备上优化SharePoint 2013站点

本文由SPFarmer翻译自Waldek Mastykarz的文章 移动市场在持续的增长,在不远的将来,使用移动设备浏览网站将会超过电脑.为了保证用户友好的体验,我们必须优化网站,以便在不同的设备上展示.SharePoint 2013 提供了一系列的选项来优化在移动设备上访问面向公众的网站.根据你的实际情况,你可以选择一个或者一系列组合的选项. 在过去的几年里,使用移动设备浏览网站得到了极大的增长.据一些研究者说,到2015年,使用移动设备访问网站会超过电脑.移动设备有不同的尺寸和功能.因为电脑

CEPH RGW 设置 user default_placement为ssd-placement,优化100KB-200KB小文件性能,使用户创建的bucket对象放置到 SSD设备上。

sudo radosgw-admin metadata get user:tuanzi > user.md.json vi user.md.json #to add ssd-placement { "key": "user:tuanzi", "ver": { "tag": "__gHSAD0K7rEZcQ2m3qT_RWk", "ver": 1 }, "mtime&quo

Unity3D游戏在iOS上因为trampolines闪退的原因与解决办法

http://7dot9.com/?p=444 http://whydoidoit.com/2012/08/20/unity-serializer-mono-and-trampolines/ 确定具体原因 那么好吧,打一个测试版本再来看,然后再等着崩溃,查看崩溃日志吧,最终看到的崩溃日志中,崩溃线程输出信息如下: Thread 27 Crashed: 0 libsystem_kernel.dylib 0x38e671fc __pthread_kill + 8 1 libsystem_pthrea

复杂TableView在iOS上的性能优化

声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业盈利.欢迎转载,但是希望转载的时候加上出处连接,谢谢.译者联系方式 [email protected],如果有 iOS 开发之类的问题,欢迎?一起讨论,谢谢.另,由于本人翻译经验不多,如果翻译不妥或者理解不到位的地方,希望各位朋友海涵,可以发信到上述邮箱,我会及时地根据大家的反馈,对翻译稿做及时地修改,谢谢!

怎样将游戏从Unity导到iOS设备上

当我开始开发自己的iOS游戏时,我会考虑的第一件事便是如何将其导出到设备中,如此有效地测试我的游戏.最初,该过程看似很长且复杂,我所遇到的主要问题是,尽管存在许多资源,但是它们并非完全来自同样的地方,所以我不得不通过各种教程将其组合并匹配在一起.所以我决定通过本文一步步地总结这一过程.这是我到目前为止所遵循的一些方式;希望这也能够带给处于同样开发阶段的人更多帮助. 1.获得unity和iOS导出器 如果你还未这么做,你首先需要在官网下载最新版本的Unity.已经出现了2个版本,分别是免费版(ht

史上最全的MySQL高性能优化实战总结!

1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已. 今天给大家体验MySQL的优化实战,助你高薪之路顺畅.图 - MySQL查询过程 1.2 优化的哲学 优化有风险,涉足需谨慎 1.2.1 优化可能带来的问题 1.2.2 优化的需求1.2.3 优化由谁参与 在进

与下位机或设备的通信解析优化的一点功能(续补):动态编译

原文:与下位机或设备的通信解析优化的一点功能(续补):动态编译 继上一篇<与下位机或设备的通信解析优化的一点功能:T4+动态编译>  ,现在已经生成出解析用的类的C#源码了,接下来,就轮到动态编译生成Type了. 在实现上,.net framework和.net core上,有些不同: .Net Framework的: 1 var transfer = ""; //解析后的C#源码字符串 2 3 ICodeCompiler comp = new CSharpCodeProv

Mysql 5.7 JSON 与 物联网设备上数完美结合

MySQL 5.7.15 新特性一 (json) 更多更浓参考官网 https://dev.mysql.com/doc/refman/5.7/en/json.html 一.测试过程 1.创建库表 create database veh_history; use veh_history; CREATE TABLE `t_equipment_traffic` (   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',   `cn` char

如何在移动设备上调试网页

这篇文章所讲到的方法已经过时,请移步<移动端真机调试终极利器-BrowserSync>,欢迎分享更多工具. 手机端页面,大多运行在webkit内核的浏览器上,但还是会因平台.厂商的不同而有种种兼容性问题.下面就介绍一下在iOS和Android两个平台上如何在真机上对页面进行调试.这里要说明的是,iOS平台只能用自带的Safari浏览器来调试,而Android平台也只能用google Chrome浏览器来调试.当然,我目前只发现这么两种手段,如果你还有其他方法可调试更多的浏览器,希望你能留言告诉