如何用好Unitywin10自带qq好用吗的Profiler

3662人阅读
& & Unity客户端优化中最常使用的辅助优化工具是Profiler。使用Profiler,可以方便我们定位游戏程序的性能瓶颈,如定位游戏中单帧耗时过高的模块、定位游戏中产生GC较多的模块等等。
& & 尽管如此,在实际优化分析过程中,即使直接使用Profiler定位到游戏瓶颈的大致模块,也往往不能分析出更精确的瓶颈代码。例如,在实际开发过程中,我们发现Game.Update()这一模块特别耗时,其实也是无补于事。因为Game.Update()这一模块下层可能涵盖了网络交互、战斗、聊天等多个自定义模块,如果这些模块不是使用Unity自带的MonoBehavior.Update实现帧循环,我们就不能往更深层次模块进行分析了。
& &&在默认的情况下,Profiler仅为Unity自带的函数添加了性能采样点(如MonoBehavior的函数、Resources库函数等),但是Profiler无法直接对我们用户的代码进行采样分析。
& & 使用Profiler评估客户端性能时,推荐使用Profiler提供的性能采样接口,来更精确地分析定位客户端存在的性能问题。
& &&优点:使用Profiler提供的性能采样接口,最大的优点是可以更深层次地分析用户代码的性能热点,避免定位到大致模块后,无法继续往下分析,只能通过其他方式(如代码审查)继续优化的尴尬。
& & 举个例子,如图:
使用BeginSample、EndSample配对,可以有效定位用户自己编写的代码
& & 由上图可见,在没有使用Profiler.BeginSample()定位的情况下,Profiler只能分析到Game.Update()模块比较耗时,往下只能看到耗时大头在Loading.ReadObject这一点上,但是由于逻辑无关,我们无法分析导致加载耗时的模块具体发生在Game.Update的哪一子模块。
& & 而使用Profiler.BeginSample()定位后,我们可以有层次性地发现,单帧耗时过大的瓶颈耗点位于 &Game.Update() -& GameNewWork.Update() -& HandleIO&。
& & 除此之外,我封装了一套自己的接口,代码在本文最后面。之所以封装一层,原因如下:
& & & & 1、提供Profiler性能采样开关,可随时关闭
& & & & 2、提供字符串格式化功能,可在Profiler中显示自定义的文本,方便定位问题(使用时需要谨慎,后文叙述)
关于格式化字符串
有时候光知道热点代码位置是不够的,还需要知道代码中变量数据。
例如下图OnRecv函数,代码只是根据cmd参数,获取已注册的句柄,然后调用。如果没有格式化功能,我们只能知道代码最终执行到这一环节,而不能准确定位该句柄代表的是哪个函数。使用格式化功能,把对应句柄的函数名打印出来,我们就可以知道热点对应的是哪一个函数。
慎用格式化字符串
以上代码会较高频率地触发垃圾回收(GC.Collect()),是不是逻辑代码有问题?
经测试发现,CurrentState.Update片段几乎均为每帧0B的开销,而其他代码也不存在内存分配现象,GC.Collect()是ProfilerSample.BeginSample(format)导致的。
需要注意格式化字符串本身会带来内存分配开销,使用格式化字符串采样接口时需考虑自身对代码带来的影响。
使用经验:
1、在可能的热点函数上插入性能采样代码,建议编译手机版本来分析结果。当然,在熟悉代码的前提下,可以方便使用PC测试分析GCAlloc等问题。原因如下:
& & 1)PC性能相对太好,一些手机上的瓶颈函数在PC上几乎不耗时,导致无法准确分析;
& & 2)一些代码,特别是插件代码,PC和手机的执行流程不同,PC分析的结果不能准确表明手机也是同样结果。
2、在插入性能采样代码时,特别留意函数中是否存在多个return的现象。这些return如果没有处理好,就有可能导致性能采样的Begin和End不匹配,导致Profiler显示的结果有误。
3、对于协程函数,BeginSample、EndSample之间注意不能存在yeild return null,否则可能导致Unity客户端卡死、手机卡死等现象。个人分析:Begin和End配对分析的是单帧结果,出现yeild return null代表该区间将会分两帧甚至多帧完成。
封装好的性能采样接口代码:
using UnityE
public class ProfilerSample {
public static bool EnableProfilerSample =
public static bool EnableFormatStringOutput =// 是否允许BeginSample的代码段名字使用格式化字符串(格式化字符串本身会带来内存开销)
public static void BeginSample(string name) {
#if ENABLE_PROFILER
if(EnableProfilerSample){
Profiler.BeginSample(name);
public static void BeginSample(string formatName, params object[] args) {
#if ENABLE_PROFILER
if(EnableProfilerSample) {
// 必要时很有用,但string.Format本身会产生GC Alloc,需要慎用
if (EnableFormatStringOutput)
Profiler.BeginSample(string.Format(formatName, args));
Profiler.BeginSample(formatName);
public static void EndSample() {
#if ENABLE_PROFILER
if(EnableProfilerSample) {
Profiler.EndSample();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12460次
排名:千里之外
原创:13篇
(3)(1)(1)(4)(1)(3)腾讯大咖说:腾讯是如何做Unity手游性能优化的
日期: 14:06:34
来源:ITeye
腾讯大咖说:腾讯是如何做Unity手游性能优化的
本文由腾讯WeTest授权发布
作者:chunhe,腾讯资深后台开发工程师。
著作权归作者所有。商业转载请联系WeTest获得授权,非商业转载请注明出处。
俗话说,用户体验不谈性能就是耍流氓。 在PC游戏上的性能问题并没有那么明显,加个内存换个CPU或者刷个主频就能轻松搞定;到了手游时代后情况则显得比较严峻,捉襟见肘的内存使得资源加载时如履薄冰,加上高中低不同配置的机型让性能问题显得更加突出,一个低端机型上的卡顿就可能造成一大批屌丝用户的流失,这当然无法被忽视。
在手游的浪潮之巅,腾讯对于手游品质的要求从1.0到2.0再到现在的3.0,不仅是玩法和内容,在游戏质量的审核上也始终如一的保持着高要求高标准。腾讯游戏的品质管理中心在Unity手游性能上进行了更深层次的挖掘,这是一个腾讯内部非常受欢迎的性能分析产品,无论你是否正在从事Unity相关的工作,听完这个良心产品的故事保证会让你增加90%的魅力值。但在此之前、先要看看你的“性”能到底行不行?
(下文有大量专业术语,有可能引起您的不适,请在家长指导下阅读。)
一.常见的Unity手游性能问题有哪些?
Unity手游的性能问题一直是被业内视为诟病,腾讯公司内部的TDR评审就是一个专门针对技术细节进行专家团评估的环节;早期的TDR评审关注的是内存是否超标、CPU是否饱和、网络流量是否过大等数据,经过近几年手游浪潮的洗礼,现在评审过程中会更加注重细分问题的研究和排查。
如果说左边是玩家经常会遭遇到的表面现象,那右边则是基于Unity引擎深挖后的问题本质。 它们对游戏的具体影响是什么呢?就拿最近比较火的《王者荣耀》来举例,我们有幸参与了它上线前后的几个优化版本的分析,先后遇到过的问题和优化方法主要有下面几个:
由于实时对战游戏的数据包数量巨大,早期版本的帧同步策略会导致比较明显的卡顿,通过进行数据包的合并与优化逐渐解决了卡顿问题;
频繁创建和销毁的小兵对象让CPU爆表了,大量的小兵如果采用实时内存的分配和回收,会产生大量的内存碎片和系统开销,解决方法之一就是采用高效的对象池进行优化,对每个内存对象的状态进行操作即可;
性能分析过程中,发现单人同屏和多人同屏时的开销都很大,通过视野裁剪技术,使得玩家视野外的不必要的特效和渲染可以全部关闭,极大降低了CPU、GPU和内存的开销;
在高中低三档机型上玩游戏时,分别加载不同层次的特效包,这也有助于降低CPU和内存的开销;
性能分析过程中发现副本内wwise音频组件占了30%的CPU时间,果断抛弃之,采用Unity自带音频功能,优化很明显;
游戏内界面采用了UGUI的方式实现,但大量的实时UI变化使得副本内每帧会有230以上的drawcall,导致中低端机型感受到明显卡顿,最终采用UGUI+自研究UI的组合拳,重写了一套紧密结合游戏自身特性的UI来实现战斗血条和浮动文字的效果。
二.手游发布之前的性能分析
近年来,经过若干惨痛的教训之后,业内已经逐渐意识到手游性能已成为了生死存亡的关键,特别是对于做大DAU的手游来说尤为重要。腾讯对于手游性能的测试和监控也是多管齐下,在新版本发布之前会再三确认性能是否符合发布标准,拿王者荣耀这款实时竞技游戏来说,在测试阶段会采集大量的性能数据进行分析,测试经理对各项性能指标进行评估并给出最终质量结论。
如上图所示,首先,功能测试也就是通常所说的人肉测试,用于测试游戏的新、老功能点,测试工程师在工作过程中可以使用进行数据采集;自动化测试则是基于腾讯WeTestgautomator自动化框架来实现,功能类似于Robotium,在无须人力参与的情况下能覆盖到绝大部分技能、角色和关卡;灰度发布指的是在一个很小范围定点推送手游的新版本,并观察运营期的质量情况和玩家反馈。无论是哪种测试方法,在过程中都可以用进行数据采集,在测试完成后,服务器会自动进行数据分析并给出多项性能数据结论;这些性能数据的结论来自于Unity官方的推荐标准值和腾讯游戏海量的经验库,如果同意机器给出的结论则可以巩固当前算法,当然也可以挑战自动分析的结论,帮助后台改进算法,最终版本质量结论还是来自于测试经理的判断。
看到这里是不是有一个疑问:不做性能分析行不行?当然行,并且你的产品照样能发布、能上线,带来的结果就是用户抱怨用户投诉用户流失。生病了、还得老老实实的去看病去吃药;冰冻三尺非一日之寒,一场大病的费用远比日常保养要贵的多,对应测试行业的名言就是“bug发现的越早、修复成本越小”。
三.工具的简介
目前市面上大多数性能工具都还停留在操作系统级别的数据上, 在游戏自身的分析上似乎还缺少点什么,所以腾讯的工程师们觉得还可以往灵魂深处挖一挖,于是就研发了这个手游性能分析工具,可以让用户以最小的成本在真机上进行游戏性能深度分析。常见的游戏质量改进的过程如下图,能帮你完成的是前两个环节,至于第三步、解决问题当然还是要开发人员去改代码了。
通过的深度分析,能够帮助开发者发现当前游戏内分类资源的占用情况。
如上图所示,在资源分析纬度上可以给出如下结论:
资源使用总量是否在合理范围之内。
一个场景内的资源重复率。
资源对象拷贝的数量是否合理。
场景切换时保留的资源详情。
网格、纹理、音频、动画、GameObject等资源是否超标。
在性能分析纬度上,以腾讯的TDR标准为例,在高中低三档机型上会有不同的标准,在三档机型中做了自动的筛选和判定,便于开发人员能更加直观的发现问题。(如下图)
首先、在游戏场景内对于FPS、CPU、PSS的变化趋势是需要重点关注的;其次、对于mono这种只增不减的东西,当然也是关注的重点,mono堆内存的不断分配会直接导致PSS内存增长且不可逆;再次、对于和渲染有关的drawcall,也是手游需要关注的性能指标之一,drawcall太高会导致FPS陡降,造成视觉上的卡顿。
四.同类工具对比
MAT (Memory Analyzer Tool)的缺点:
需要导入HPROF文件再分析;
只能查看java层的内存情况,看不到native堆的详情;
xcodeinstrument 的缺点:
只能用于mac,ios;
只能查看C++ 或 object C 的情况,看不到mono堆的详情;
Unity Profiler 的缺点:
需要单独编译develop版本;
在PC上执行,没法捕获真机数据;
内存数据跟实际真机的数据差异很大、多的时候有几十M差距;
只能看到最近一段时间的数据,看不到总体的详情;
对于Unity大神和开发人员,你更关心的应该是详细的性能数据,都能满足你们。大神会说“我更喜欢看着Unity profiler直接调试啊”,那你还得腾出时间编译一个develop版本、还得重新跑一遍游戏、数据和真机还相差很多,关键是大神哪来那么多时间呢?
所以答案是肯定的,日常测试工作中加入了数据采集和数据分析功能,就可以提高很大的工作效率。
我们常见的产品质量改进流程无非是下面这四步:
测试人员发现问题;
提bug 给开发人员;
开发人员编译develop版本;
开发人员用Unity profiler 定位原因;
用进行游戏测试能帮你省掉后面2个步骤,何乐而不为呢?
通常情况下,开发人员是间隔几个星期甚至几个月才会去做一次性能调优的工作,中间已经隔了N个版本,有很多问题会被埋的很深;基于“问题发现的越早修复成本越小”的硬道理,功能测试人员完全可以用进行日常的版本功能测试,让在后台默默的为你发现各种性能问题。
即插即用、无须编译无须嵌入SDK、真机运行数据;
提供mono内存分配信息和mono快照对比;
能看到整个测试流程中的所有数据,而不仅仅是某一段时间;
被误操作产生的对象拷贝数量;
函数开销排名;
关卡间保留的冗余资源;
五.性能优化的N种武器
作为一个以性能优化为己任的工具类产品,不仅致力于问题的发现和定位,也希望为开发人员提供更多更实用的性能优化方法。
控制贴图大小,尽量不要超过 ;
尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图;
尽量使用压缩格式减小贴图大小;
若干种贴图合并技术;
去除多余的alpha通道;
不同设备使用不同的纹理贴图,分层显示;
尽量控制模型的面数,小于1500会比较合适;
不同设备使用不同的模型面数;
尽量保持在30根骨骼内;
一个网格不要超过3个material;
N种动画压缩方法;
尽量减少骨骼数量;
采用压缩MP3 和 wav;
资源方面的优化:
使用 Resource.Load 方法在需要的时候再读取资源;
各种资源在使用完成后,尽快用Resource.UnloadAsset和UnloadUnusedAsset卸载掉;
灵活运用AssetBundle的Load和Unload方法动态加载资源,避免主要场景内的初始化内存占用过高;(实现起来真的很难…)
采用www加载了AssetBundle后,要用www.Dispose 及时释放;
在关卡内谨慎使用DontDestroyOnLoad,被标注的资源会常驻内存;
代码的优化:
尽量避免代码中的任何字符串连接,因为这会给GC带来太多垃圾;
用简单的“for”循环代替“foreach”循环;
为所有游戏内的动态物体使用内存对象池,可以减少系统开销和内存碎片,复用对象实例,构建自己的内存管理模式,减少Instantiate和Destory;
尽量不使用LINQ命令,因为它们一般会分配中间缓器,而这很容易生成垃圾内存;
将引用本地缓存到元件中会减少每次在一个游戏对象中使用 “GetComponent” 获取一个元件引用的需求;
减少角色控制器移动命令的调用。移动角色控制器会同步发生,每次调用都会耗损较大的性能;
最小化碰撞检测请求(例如ray casts和sphere checks),尽量从每次检查中获得更多信息;
AI逻辑通常会生成大量物理查询,建议让AI更新循环设置低于图像更新循环,以减少CPU负荷;
要尽量减少Unity回调函数,哪怕是空函数也不要留着;(例如空的Update、FixedUpdate函数)
尽量少使用FindObjectsOfType函数,这个函数非常慢,尽量少用且一定不要在Update里调用;
千万一定要控制mono堆内存的大小;
性能优化就像海绵中的水,又或是内衣里的肉,挤一挤总会有的。同时,性能优化并不是一劳永逸的工作,而是一个漫长而具有挑战的任务;项目的各个阶段都会有性能上的问题,在用户体验的基础上持续进行打磨,持续保持产品的良好性能才能赢得好口碑。(和保持身体健康是一个道理)
Unity手游的性能优化过程更像是一门时空转换的艺术, 持续在CPU和内存之间取得一个平衡。空间不足时则需要释放一些无用数据,以获得更优的空间使用率;时间太长时就需要降低不必要的函数开销。例如在低端机上,为了节约有限的内存空间,静态加载的资源会相对较少,很大一部分资源通过动态加载和释放;而在高端机上则不用考虑空间的限制,可以一次性静态加载更多的资源,省去了不少loading和GC的工作,让游戏体验更加流畅。 Unity目前已经可以使用。
体验地址:
关于测试报告的问题:
使用帮助:
常见问题:
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
前言: 首先你要明白, 所谓的第三方登录,就是利用用户在第三方平台上已有的账号来快速完成自己应用的登录或者注册的功能。而这里的第三方平台,一般是已经有大量用户的平台,如国内的新浪微博、QQ空间,微信,外国的Facebook、twitter等等。第三方登录不是一个具体的接口,而是一种思想或者一套步骤。这种集成三方的东西, 都非常简单,可能会有坑, 填上就好, 这篇文章以微博为例, 其实都是一样的. 步骤或繁或简单, 习惯就好. 具体请点击我简书的原文 原文链接
需求:一半搜索界面上都会有热门搜索(我其他的博客有介绍),搜索的历史记录等等,今天这里分析历史记录的写,和存 *效果图 如图整体是一个Listview,头布局是从 搜索历史 文字开始到热门搜索是整个头布局,中间一个listview显示历史记录, 脚布局 用来处理清楚历史记录的操作,在这里使用的是sp来进行缓存的(只存了10条数据) 下面贴的代码 具体的需求具体分析,这里是写出读取,和写入记入的方法,更具需求在灵活调用即可 (1):读取历史 SharePreferenceUtil.SPACE_HISTORY
6月24日,2016AppCan移动开发者大会在北京国际会议中心盛大举行。大会以“平台之上,应用无限”为主题,全景展现AppCan移动技术蓝图和80万AppCan开发者的移动双创实践成果,并重磅发布全新产品企业移动门户——正益工作,并宣布面向开发者/合作伙伴/企业客户开源开放,全面推助开发者技术变现、加速企业移动化转型。 技术与生态共进,本届大会不仅是AppCan的技术盛会,也是移动互联网行业的盛宴:华为、科大讯飞、TalkingData、听云等20余家国内顶尖的移动互联网企业参展;东方航空、我爱我家以及
Android中的AMS想必是做android开发的工程师耳熟能详的系统级别的服务,但是它又是如此地庞大(单单ActivityManagerService.java文件就2W+行代码),因此我们在学习它的时候总是不能找到实际的主线,很是混乱。这里我会连续写几篇文章从它的启动过程,主要业务逻辑,和别的模块之间的互操作逻辑等角度来向大家简单介绍一下它。这里我只能是抛砖引玉,简单介绍,不会面面俱到,因为AMS的代码量确实比较大,如果向大家一一道来,想必大家一定会厌烦而且学习效果不好。希望大家在阅读本文的时候,同
阅读前可以先看 Android自定义图表:ChartView 需求: 通过以上例子我们修改测试数据后,拿到的View图像是这样的: 而我们要的效果是纵坐标7.45以上与5.97以下的部分为红色,7.45与6.43间为绿色,6.18与6.43之间为黄色,效果如下: 有了解自定义View的同学应该清楚从一个点画到另一个点的过程中,通过Paint与canvas.drawLine()绘制一条不同颜色的线是很不容易做到的,如果分成两条不同的线,无疑是更加增大了怎个绘制过程的复杂度。 那么我们如何去做成下图的这种效果
Android学习笔记十二之Android基础UI三 ScrollView滚动视图 ScrollView是继承于FrameLayout,也是一个显示容器,由于手机屏幕是有限的,当需要组件安排多组信息的时候,ScrollView可以安排这些组件,我们浏览的时候可以进行滑动操作,滚动显示。但是,需要注意的是,ScrollView只能包含一种组件。 实现代码: @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { supe
基本定义 Observable – 被观察者(事件源) Observer – 观察者 Creating Observables(创建操作) 以下展示了创建Observable的各种方法 Create — 通过observer的方法创建一个新的Observable Defer — 直到observer订阅的时候才会创建这个Observable,并且为每一个observer创建一个Observable Empty/Never/Throw — 创建行为受限特殊的Observable Empty — 只会发射on
博主这个系列的文章 React Native开发之IDE(Atom+Nuclide) React Native开发之FlexBox代码+图解 React Native的Navigator详解 另外,我在Github上建立了一个仓库来搜集优秀的React Native库和优秀的博客等 ReactNativeMaterials 资料 官方关于动画的介绍 官方给出的复杂动画的示例 开源项目react-native-animatable React Native Animation Book 可以用在实际项目里的
这篇文章里,我们将会讨论一些 iOS 和 OS X 都可以使用的底层 API。除了
dispatch_once
,我们一般不鼓励使用其中的任何一种技术。 但是我们想要揭示出表面之下深层次的一些可利用的方面。这些底层的 API 提供了大量的灵活性,随之而来的是大量的复杂度和更多的责任。在我们的文章 常见的后台实践 中提到的高层的 API 和模式能够让你专注于手头的任务并且免于大量的问题。通常来说,高层的 API 会提供更好的性能,除非你能承受起使用底层 API 带来的纠结于调试代码的时间和努力。 尽管如
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo 。服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了。同时用MINA2和Netty4分别实现服务端的目的,是因为很多人都在纠结到底是用MINA还是Netty来实现高并发的Java网络通信服务端,在此干脆两个都实现了,就看你怎么选择了,够吊吧。 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目
Copyright (C)
ITfish.net基于Unity的Profiler性能分析(转);1.CPUUsage;A.WaitForTargetFPS:Vsync;A.Device.Present:device.;3.MemoryProfiler;A.UsedTotal:当前帧的Unity内存、;当前帧场景中的Object数量(除GameObj;F.TotalObjectCount:;Object数据
基于Unity的Profiler性能分析(转)
1. CPU Usage
A. WaitForTargetFPS:
Vsync(垂直同步)功能所消耗的时间,即显示当前帧的CPU等待时间 B. Overhead:
Profiler总体时间-所有单项的记录时间总和。用于记录尚不明确的时间消耗,以帮助进一步完善Profiler的统计。 C. Physics.Simulate:
当前帧物理模拟的CPU占用时间。 D. Camera.Render:
相机渲染准备工作的CPU占用量 E. RenderTexture.SetActive:
设置RenderTexture操作.
底层实现:1.比对当前帧与前一帧的ColorSurface和DepthSurface.
2.如果这两个Buffer一致则不生成新的RT,否则则生成新的RT,并设置与之相对应的Viewport和空间转换矩阵. F. Monobehaviour.OnMouse_ :
用于检测鼠标的输入消息接收和反馈,主要包括:SendMouseEvents和DoSendMouseEvents。(只要Edtor开起来,这个就会存在 G. HandleUtility.SetViewInfo:
仅用于Editor中,作用是将GUI和Editor中的显示看起来与发布版本的显示一致。 H. GUI.Repaint:
GUI的重绘(说明在有使用原生的OnGUI) I. Event.Internal_MakeMasterEventCurrent:
负责GUI的消息传送 J. Cleanup Unused Cached Data:
清空无用的缓存数据,主要包括RenderBuffer的垃圾回收和TextRendering的垃圾回收。
1.RenderTexture.GarbageCollectTemporary:存在于RenderBuffer的垃圾回收中,清除临时的FreeTexture.
2.TextRendering.Cleanup:TextMesh的垃圾回收操作 K. Application.Integrate Assets in Background:
遍历预加载的线程队列并完成加载,同时,完成纹理的加载、Substance的Update等. L. Application.LoadLevelAsync Integrate:
加载场景的CPU占用,通常如果此项时间长的话70%的可能是Texture过长导致. M. UnloadScene:
卸载场景中的GameObjects、Component和GameManager,一般用在切换场景时. N. CollectGameObjectObjects:
执行上面M项的同时,会将场景中的GameObject和Component聚集到一个Array中.然后执行下面的Destroy. O. Destroy:
删除GameObject和Component的CPU占用. P. AssetBundle.LoadAsync Integrate:
多线程加载AwakeQueue中的内容,即多线程执行资源的AwakeFromLoad函数. Q. Loading.AwakeFromLoad:
在资源被加载后调用,对每种资源进行与其对应用处理. 2. GPU Usage
A. Device.Present:
device.PresentFrame的耗时显示,该选项出现在发布版本中. B. Graphics.PresentAndSync:
GPU上的显示和垂直同步耗时.该选项出现在发布版本中. C. Mesh.DrawVBO:
GPU中关于Mesh的Vertex Buffer Object的渲染耗时. D. Shader.Parse:
资源加入后引擎对Shader的解析过程. E. Shader.CreateGPUProgram:
根据当前设备支持的图形库来建立GPU工程.
3. Memory Profiler
A. Used Total:
当前帧的Unity内存、Mono内存、GfxDriver内存、Profiler内存的总和. B. Reserved Total:
系统在当前帧的申请内存. C. Total System Memory Usage:
当前帧的虚拟内存使用量.(通常是我们当前使用内存的1.5~3倍) D. GameObjects in Scene:
当前帧场景中的GameObject数量. E. Total Objects
当前帧场景中的Object数量(除GameObject外,还有Component等).
F. Total Object Count:
Object数据 + Asset数量.
4. Detail Memory Profiler
A. Assets:
Texture2d:记录当前帧内存中所使用的纹理资源情况,包括各种GameObject的纹理、天空盒纹理以及场景中所用的Lightmap资源.
B. Scene Memory:
记录当前场景中各个方面的内存占用情况,包括GameObject、所用资源、各种组件以及GameManager等(一般情况通过AssetBundle加载的不会显示在这里).
ManagedHeap.UseSize:代码在运行时造成的堆内存分配,表示上次GC到目前为止所分配的堆内存量.
SerializedFile(3):
WebStream:这个是由WWW来进行加载的内存占用.
System.ExecutableAndDlls:不同平台和不同硬件得到的值会不一样。******************
5. 优化重点
A. CPU-GC Allow:
关注原则:1.检测任何一次性内存分配大于2KB的选项 2.检测每帧都具有20B以上内存分配的选项.
B. Time ms:
记录游戏运行时每帧CPU占用(特别注意占用5ms以上的).
C. Memory Profiler-Other:
1.ManagedHeap.UsedSize: 移动游戏建议不要超过20MB.
2.SerializedFile: 通过异步加载(LoadFromCache、WWW等)的时候留下的序列化文件,可监视是否被卸载.
3.WebStream: 通过异步WWW下载的资源文件在内存中的解压版本,比SerializedFile大几倍或几十倍,重点监视.
D. Memory Profiler-Assets:
1.Texture2D: 重点检查是否有重复资源和超大Memory是否需要压缩等.
2.AnimationClip: 重点检查是否有重复资源.
3.Mesh: 重点检查是否有重复资源.
6. 项目中可能遇到的问题
A. Device.Present:
1.GPU的presentdevice确实非常耗时,一般出现在使用了非常复杂的shader.
2.GPU运行的非常快,而由于Vsync的原因,使得它需要等待较长的时间.
3.同样是Vsync的原因,但其他线程非常耗时,所以导致该等待时间很长,比如:过量AssetBundle加载时容易出现该问题.
4.Shader.CreateGPUProgram:Shader在runtime阶段(非预加载)会出现卡顿(华为K3V2芯片). B. StackTraceUtility.PostprocessStacktrace()和StackTraceUtility.ExtractStackTrace():
1.一般是由Debug.Log或类似API造成.
2.游戏发布后需将Debug API进行屏蔽. C. Overhead:
1.一般情况为Vsync所致.
2.通常出现在Android设备上 D. GC.Collect:
原因: 1.代码分配内存过量(恶性的)
2.一定时间间隔由系统调用(良性的).
占用时间:1.与现有Garbage size相关
2.与剩余内存使用颗粒相关(比如场景物件过多,利用率低的情况下,GC释放后需要做内存重排)
E. GarbageCollectAssetsProfile:
1.引擎在执行UnloadUnusedAssets操作(该操作是比较耗时的,建议在切场景的时候进行).
2.尽可能地避免使用Unity内建GUI,避免GUI.Repaint过渡GC Allow.
3.if(other.tag == GearParent.MogoPlayerTag)改为pareTag(GearParent.MogoPlayerTag).因为other.tag为产生180B的GC Allow.
F. 少用foreach,因为每次foreach为产生一个enumerator(约16B的内存分配),尽量改为for.
G. Lambda表达式,使用不当会产生内存泄漏.
H. 尽量少用LINQ:
1.部分功能无法在某些平台使用.
2.会分配大量GC Allow.
I. 控制StartCoroutine的次数:
1.开启一个Coroutine(协程),至少分配37B的内存.
2.Coroutine类的实例 -- 21B.
3.Enumerator -- 16B.
J. 使用StringBuilder替代字符串直接连接.
K. 缓存组件:
1.每次GetComponent均会分配一定的GC Allow.
2.每次Object.name都会分配39B的堆内存.
三亿文库包含各类专业文献、中学教育、幼儿教育、小学教育、应用写作文书、专业论文、文学作品欣赏、外语学习资料、生活休闲娱乐、10基于Unity的Profiler性能分析等内容。 
 Unity3D 游戏开发之分析器(Profiler)窗口详解分析器 (Profiler) 窗口 附加到 Unity 播放器 要分析在其他设备上运行的游戏或在其他计算机上运行的播放器,可以将 ...  unity3D技术之Performance Optimization 性能优化_互联网_IT/计算机_专业资料。unity3D技术1. Use Static Typing 使用静态类型 When using JavaScript the most importan...  Unity项目优化总结_调查/报告_表格/模板_实用文档。...1、GC Collect: 连机 Profiler 发现 CPU profile ...的代码以提高性能,但 IL2CPP 目前实现不完整,类似 ...  要和项目集成性能分析工具,在对话框中单击 OK 按钮。IDE 将创建一个 build.xml 的备份,其名称为 build-before-profiler.xml,并将以下行添加到 build.xml 中:...  前言关于性能分析工具 (该文翻译者:Edison Guo 原文见 Flex Builder 3.x 帮助文档 About Profiling) Adobe Flex 性能分析工具(Profiler)能够帮助我们诊断应用程序中...  unity3d游戏开发之性能基准_计算机软件及应用_IT/计算机_专业资料。unity3d游戏开发之性能基准 unity 将要努力支持的一个振奋人心的新平台就是 WebGL。我们将 Unity...  Unity3D技术之Advanced优化图形性能详解_IT/计算机_专业资料。Unity3D 技术之 Advanced 优化图形性能详解优化图形性能良好的性能对大部分游戏的成功具有决定作用。下面是...  2. 用 profiler 进行性能分析,找出性能瓶颈,其实很多时候上面提到 的注意事项并...基于matlab的fft仿真 6页 3下载券
matlab中fft的应用 2页 1下载券 喜欢...  加强游戏运行性能是一个漫长而具有挑战性的过程,游戏开发社区所分享的大量知识, 以及 Unity 提供的出色分析工具为《Shadow Blade》实现目标运行性能提供了极大帮助。...}

我要回帖

更多关于 苹果自带的地图好用吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信