联机Unity Profile技巧

537017_play.jpg

这里暂且讨论使用Mac对iOS设备进行调试的方法。至于Android平台,会有细节但不是非常重要的不同。

为什么需要联机Profile?

大部分情况,直接在工作机(PC、Mac)用Unity针对工程进行Profile就能查出性能的瓶颈。
但在不同的设备会有不同的性能表现、甚至一些设备由于硬件设计的原因,导致一些性能瓶颈只有在特定设备上才会表现出来。
针对这些设备相关的性能问题,需要进行联机Profile。

Profile的手段概述

iOS设备通过USB连接Mac后,对其进行Profile手段有三种:

  • Unity进行Profile


    unity_profile
  • XCode进行Profile


    xcode_profile
  • XCode在debug模式时的“GPU Report”


    xcode_fps

3种Profile手段的特点

上面的3种Profile有以下特点:

  • Unity或者XCode的profile能准确地显示各项功能/函数消耗。
    • 但这两种方式本身会引起大量的profile overhead,会引起设备上的“虚卡”,所以它俩的所描述的更多是功能/函数间的相对大小关系
    • 建议优先使用Unity的Profile,因为它的显示信息比XCode的Profile更加实用
  • XCode的“GPU Report”开销较小,数据能真实地反应设备运行情况,所以能收集绝对的整体消耗大小

3中Profile手段的具体步骤

Unity进行Profile准备步骤

  1. 通过USB连接调试设备和Mac

在Build Settings里如下图选择“Development Build”和“Autoconnect Profiler”,然后点击“Build”或者“Build And Run”


unity_profile_build_setting
  1. 构建中途,Unity会调用XCode自动进行编译、自动进行运行。
  2. 设备运行我们的app了之后,在Unity打开Profiler面板,并且如下图选择“iOS profiler over USB”,也就开始进行profile了。


    unity_profile
  3. Unity进行Profile准备步骤结束。

XCode进行Profile

  1. 通过USB连接调试设备和Mac。
  2. 确保调试设备能够进行调试你的app

关于Apple Developer和Provisioning Profiles
* 一个apple developer有一个apple id
* 这个apple id下有不同的证书(certificates)。证书证明了这个apple id有能力进行软件的开发、分发。
* 这个apple id下有不同的app,每个app对应一个app id(也称bundle id)。表明这个apple id正在开发、分发哪些app。
* 这个apple id下有不同的设备,每个设备对应一个设备id。表明这个apple id关联了哪些设备。
* 这个apple id下有不同的Provisioning Profiles。一个证书id、一个app id和一个设备id列表,组成了一个Provisioning Profiles。意思是,“因为有了这个Provisioning Profiles,我可以用这些设备来调试这个app”。
所以,要成功让XCode连上你的设备并调试你的app,你必须拥有正确的Provisioning Profile。
更多可以参考Apple Developer官网里的“Member Center”。

  1. 在Unity进行Build了之后
  2. 在XCode打开相应的工程,如下图点击Product>Profile


    xcode_profile_png
  3. XCode编译完了之后,会打开“Instruments”正式开始Profile调试
    • 可以通过“Instruments”里面的“Library“来选择不同维度的Profile,比如“Activity Monitor”可以监控设备的各个进程情况、“Core Animation”可以监控帧数、“OpenGL ES Analyzer”可以监控图形API层面的调度情况。
  4. XCode进行Profile准备步骤结束。

XCode进行“GPU Report”

大体的准备规则和上面的“XCode进行Profile”差不多,主要差别在后面几步:

  1. Unity输出XCode工程后,在XCode打开相应的工程,直接点击“播放键”三角形;
  2. 当设备自动运行app后,点击下图左部的
    debug_navigator

    按钮


    xcode_fps
  3. XCode进行“GPU Report”准备步骤结束。

Profile的方法论

如何找到性能瓶颈

项目乃至人生,都是一个选择、试错、总结,再选择、再试错、再总结的循环过程。这个过程并非白费,而是提高自己的经验和能力,减少之后选择错误的几率。

通过Profile找出性能瓶颈的通用步骤如下:

  1. 通过功能Profile统计列表,找出占用CPU时间/GPU时间最多的“瓶颈功能”。注意一帧所消耗的时间=Max(CPU时间, GPU时间),而并非它们的和;
  2. 如果这个“瓶颈功能”是脚本函数等具体的、熟悉的功能,则已经确切找到性能瓶颈,步骤结束。
  3. 如果这个“瓶颈功能”是不具体的(比如“引擎渲染透明物体”、“引擎渲染cull预处理”就是不具体的),则继续执行以下“广度遍历尝试”步骤:
  4. 对游戏以不同维度进行拆分,以达到不同功能维度之间可以不相干地切换“ON/OFF”状态。注意,选择哪一种维度进行拆分是关键的;
  5. 进行多次尝试,每次尝试只有一个维度在“ON”状态、其他维度在“OFF”状态;
  6. 统计众多尝试中,最影响性能的维度A;
  7. 将维度A进行子划分,重复第4步,直到找到确切性能瓶颈。
  8. 如果维度A优化掉后效果依然不达标,则重复到第1步。

找到性能瓶颈后该怎么处理

处理方法可以有以下方法:

  • 无损处理:进行优化,让性能瓶颈优化成在任何情况下都不出现。比如算法优化、内存访问优化等。
  • 有损处理:可能受限于运行环境,无损处理不可能完成,这需要有损地进行处理,让性能瓶颈在特定情况下才不出现。比如Camera距离LOD、设备功能LOD等。

具体Profile案例(Killer Project)

2014-08-10

问题

策划要求敌人批量刷出至少15个,但在iPhone4上,15个敌人已经很卡。

目标

出现瓶颈的设备:iPhone4。目标帧率30fps,所以目标帧时间为33.33ms。考虑到iPhone4是低端机型,允许偶尔降到20fps,所以允许帧时间偶尔达到50ms

Profile步骤

使用Unity进行联机Profile,发现渲染透明物体是性能瓶颈。


屏幕快照 2014-08-11 下午9.00.59.png

尝试过把场景里的透明物体都去掉,效果不明显


屏幕快照 2014-08-11 下午9.01.43.png

所以依次进行了以下“ON/OFF”的尝试。除了寻找真正瓶颈透明渲染之外,中间还输出了其他的结论点

|特性|帧数|CPU时间|GPU时间|结论|可能美术解决方案|可能程序解决方案
|--|--|--|--|
|场景OFF、15小兵|12|80ms|39.7ms|CPU瓶颈:小兵占用过多CPU;小兵刷出时依然占用较大CPU|减少小兵骨骼;减少小兵动画帧数;|减少小兵trigger节点;场景加载后进入场景前,进行小兵在SpawnPool里的预创建
|小兵OFF、场景|29|29.8ms|33.5ms|无瓶颈:madfinger的天空盒效率甚高;|无|无
|小兵OFF、场景
去除所有shadow cast|30|23ms|32ms|去除shadow cast/receive可以较好提高CPU效率|需要给mesh都去掉shaodw cast/receive|无
|场景、15小兵|6|180ms;|176ms|最初情况。场景单独OFF没问题、小兵单独OFF问题不大,但他们同时出现却有大问题。 |见下面比较方案 |见下面比较方案
|场景、15小兵(无阴影)|15|64ms|43ms|一当加上场景就卡的原因是,小兵需要投影圆形阴影到场景 | 无|程序进行设备LOD,当是低端机的时候,需要去掉所有blob shadow projector

结论,敌人脚下的Blob shadow projector阴影是真正的透明渲染瓶颈所在,可以采取设备LOD,在iPhone4上直接去除掉这个功能。
可以发现尽管去掉阴影后,效率还是无法达标,所以需要再重投进行一次profile。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 引言 关于开发证书配置(Certificates & Identifiers & Provisioning Pro...
    奋斗的蜗牛阅读 7,166评论 2 20
  • 引言关于开发证书配置(Certificates & Identifiers & Provisioning Prof...
    molake阅读 47,623评论 7 62
  • 我想去做个渣男 会说会用心 我想去做个渣男 有浪漫的土耳其 还有操他妈的迈阿密 我想做个渣男 有环球旅行 有女孩同...
    318在裸奔阅读 96评论 2 1
  • 抱着上千页Java啃,其实啃到继承这里已经有点糊涂了。还是因为编程中没有用到的缘故吧。今天可能碰到了一个,纪念一下...
    匿称也不行阅读 329评论 0 0
  • 今天开始使用简书。之前有注意过简书的logo,觉得简洁大方,毕竟我们的汉字本身就足够艺术。 打开这个界面,感觉就是...
    seafruit阅读 130评论 0 0