Android 性能个案研究 已翻译 100%

PepsiZero 投递于 2013/05/09 11:12 (共 26 段, 翻译完成于 08-05)
阅读 8257
收藏 165
17
加载中

Falcon Pro

我最近在我的Nexus 4上安装了Falcon Pro,一个新的Twitter客户端。我真的很喜欢使用这个应用程序,但我在使用它时注意到了某些地方存在一些问题,看起来滚动主时间轴并没有得到非常稳定的帧率。我深钻了一下我每天工作所用工具和技术中的一些,我能很快地找到一些Falcon Pro 并不如它本可以表现得那么好的原因。

Falcon Pro

我在这篇文章里的目的是告诉你如何追踪和修复应用程序中的性能问题,即使你没有它的源代码。所有你需要的只是一份最新的Android 4.2 SDK –新的ADT bundle使设置变得简易。我极力推荐你下载这个应用程序来亲自应用这里描述的技术。对你来说不幸的是Falcon Pro是款付费应用,因此我将给您提供你可以下载的各种文件的链接来跟随我的分析。

赵亮-碧海情天
赵亮-碧海情天
翻译于 2013/06/18 00:06
3

关于性能

Android 4.1把重点放在Butter项目的性能上,它带来了新的性能分析工具,如systrace。Android 4.2不提供象systrace那么显著的工具,只是提供了对你的工具箱的一些有益补充。在本文的后面你会发现这些新工具中的一个。

性能分析往往是一个复杂的任务,需要大量的经验和对某些工具、硬件、API的深入的知识等等。经验使我能只用几分钟就进行在这里展示的分析——你可以在我十二月一日的Twitter stream上看到它“实时”发生。你可能要多试几次才会感觉这种工作很容易。

赵亮-碧海情天
赵亮-碧海情天
翻译于 2013/06/18 00:34
1

证实我的怀疑

关于性能操作,牢记最重要的一件事就是始终用测试去验证你的行为。即使Falcon Pro 在Nexus4上运行帧率下降看起来很明显,我还是需要确认一下。因此,我将应用安装到一部提供不同于Nexus性能概况并且比Nexus4更强大的Nexus7上。Nexus 7提供了一个有趣的更有优势的性能分析工具,我们以后再谈。

在Nexus 7安装应用程序并没有什么区别,我仍能看到帧率下降。应用甚至显得稍差。为了描述这个问题,我决定用4.1以后引入的“GPU呈现模式分析”工具。你可以在应用设置下的“开发者选项”中找到它。

如果“开发者选项”在你的android4.2设备上不能使用,找到“关于手机”或者“关于平板”勾选底部的7的倍数构建选项。

Turn on Profile GPU rendering

苏谷子
苏谷子
翻译于 2013/06/25 13:51
1
当选项打开后, 系统会保持跟踪每个窗口绘制最后128帧所耗费的时间。使用这个工具你必须首先结束掉应用– android将来的版本将摆脱这个限制。


方法说明:除非另有规定,本分析每个测量是通过每次缓慢滚动主时间轴上下几点,显示最多有一个额外的列表项。

在运行应用,主时间轴开始滚动时候,我在终端执行了如下命令:

$ adb shell dumpsys gfxinfo com.jv.falcon.pro

在产生的日志中,你会发现一个标题为: Profile data in ms. 这一节包含为每个窗口所属应用产生的3列表格。 为了使用这些数据, 简单的复制表格到你喜欢的电子表格软件中就会生成一个堆叠柱状图表。下面的图是我的测量结果 (原始表格数据 可以在线查看.)

苏谷子
苏谷子
翻译于 2013/06/26 08:46
1
每列给出渲染每帧大概需要多长时间:
  1. Draw是消耗在构建java显示列表的时间。 它显示出运行方法用的时间诸如View.onDraw(Canvas).
  2. Process是消耗在Android的2D渲染器执行显示列表的时间。你的视图层次越多,要执行的绘图命令就越多。
  3. Execute是消耗在排列每个发送过来的帧的顺序的时间.这部分的图通常是很小的。

注意:使顺利在60帧,每帧必须小于16毫秒完成。

关于Execute:如果执行耗费了过长的时间,这意味着你是跑在前面的图形管线。 android在运行时可以有3个缓冲区.如果你需要另一个应用程序将阻塞直到其中的一个缓冲区释放出来。两个原因会发生这种情况。第一,你的应用在Dalvik中快速绘制但在GPU显示列表时候消耗了大量时间。第二,你的应用程序花了很长的时间来执行第几帧;一旦管线满了他将无法赶上,除非动画完成。我们希望Android在未来版本中改进。

该图显然证实了我的怀疑:通常应用运行良好,不过有时候会运行帧率下降。

苏谷子
苏谷子
翻译于 2013/06/26 09:17
1

进一步观察

尽管我们收集的数据显示,应用有时候花费太久去渲染,但是这并不是全部的事实。帧刷新率也能够被没有调度或者错误调度的帧所影响。例如,一个应用总是以少于16ms的时间来画图,但是有时候在帧之间展现更长的任务,有时他将失去一个帧。

Systrace 是用于检查,一个Falcon Pro 是否在遭受这个问题最简单的工具。这个工具是一个具有非常低开销的系统分析工具。它的时域分析相当精确,并且给你展示了整个系统在做什么,包括你的应用。

为了让systrace起作用,进入Developer options并且选择Enable traces。一个对话框出现,并且让你选择你想要分析什么类型的事件。我们只关心GraphicsView

注意: 不要忘记关掉分析GPU rendering。

Enable systrace

wenger67
wenger67
翻译于 2013/06/26 15:07
1

为了使用systrace,打开一个终端,并从Android SDK的tools/systrace下运行systrace.py:

$ ./systrace.py

默认该工具将捕获5秒钟事件我只是上下滚动主时间轴。跟踪结果是一个独立的HTML文件。

建议:为了在systrack中能够导航,可以使用WASD键平移和缩放。W将会放大鼠标光标处的内容。

一个systrack文件展示了很多有趣的信息。比如,它表明你是否有一个进程计划在CUP。如果你放大到名为10440: m.jv.falcon.pro的最后一行,你能看到应用做了些什么。如果你查看performTraversals中的一块,你能看到应用绘制一帧消耗了多长时间。

虽然大多数的performtraversals低于16毫秒的临界值,但是有些需要更多的时间,这也证实了先前获得的测量结果(放大在935 MS标记看到这样一块。)

苏谷子
苏谷子
翻译于 2013/06/27 08:15
1

更有意思的是,你可以看到应用有时候会丢失一帧,因为它没有安排一个绘制操作。放大到标记为270毫秒的地方,找到deliverInputEvent 块,消耗25毫秒。这些块表示应用消耗25毫秒来响应用户触摸事件。由于应用程序是使用ListView,这可能是由于在适配器的一个问题,我们随后会回过头来讨论。

Systrace十分有用,不仅是它能检查应用消耗过多的是在绘制上,而且也能帮助我们找到其他的性能瓶颈。尽管它很有用,但是也存在自身的局限性。它只提供了高层次的数据,我们需要利用其他的工具才能明白它真正发生了什么。

苏谷子
苏谷子
翻译于 2013/07/03 18:39
1

可视化的透支

绘制性能问题可能有很多根本原因,但是其中一个常见的是透支。透支发生在应用每次向系统请求在其他物体上绘制内容。想像一个最简单的应用问题:一个白色背景的窗口,在它的上面一个按钮。当系统绘制按钮时,要绘制已存在的白色背景上。这就是透支。

透支是不可避免的,但是过多的透支就会产生问题。设备具有有限的内存带宽,如果透支导致你的应用请求资源超过了可用带宽,就是造成性能下降。不同设备可以明确负担透支的数量是变化的。

一个好的经验法则是针对最大透支的2倍;这意味着你可以绘制屏幕一次,再画上画两次,每个像素总量的3倍。

透支的存在也通常表示其他问题:太多的视图,层次结构复杂,通胀时间较长,等

苏谷子
苏谷子
翻译于 2013/07/03 18:56
1

Android提供了三个工具来识别和修复过度绘制: Hierarchy Viewer, Tracer for OpenGLShow GPU overdraw前两个可以在ADT或者独立的监控工具中找到。最后一个是开发这选项的一部分

Show GPU overdraw 使用不用的颜色来绘制屏幕,来指示过度绘制在哪里发生以及程度如何。打开此选项然后别忘了关闭你自己的应用 – 未来的Android版本中将不再需要这样做。

Enable overdraw debugging

在看Falcon Pro之前,让我们看一下设置Show GPU overdraw选项的页面长什么样。

Settings with overdraw debugging

lwei
lwei
翻译于 2013/06/30 21:22
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(16)

夲仒無道
夲仒無道
Mark!
汪渝栋
汪渝栋
hhh
A
Asvel
如果“开发者选项”在你的android4.2设备上不能使用,找到“关于手机”或者“关于平板”勾选底部的7的倍数构建选项。

这个是说
如果“开发者选项”在你的android4.2设备上不能使用,找到“关于手机”或者“关于平板”中最底部的“版本号”一项点击7次
kongnanlive
kongnanlive
@红薯 太老了!给你发个中文版的。http://yunfeng.sinaapp.com/?p=458
LVAN
LVAN
有点意思的,呵呵
pqiankui
pqiankui
好复杂的文章,表示基本没看懂
狄仁傑
狄仁傑
颠覆了我对android开发的认知啊
熊宇
翻译为啥没译字标注和Romain Guy的原文地址?
湛蓝的天空
真牛掰!
返回顶部
顶部