用Adobe Scout精确的分析

 要求

预备知识

 为了学习本教程,请先阅读Getting started with Adobe Scout。

用户级别

 中级

要求的产品

  Adobe Scout

    在您开始使用Adobe Scout的那一刻起,您将可以观察大量的数据。它几乎触及到您的内容里的各个方面,Flash Player平台在ActionScript代码执行的同时将其单独的呈现出来。从一开始它就在寻找您的内容里的性能问题,但在您使用前,先去了解这些数据是如何搜集的。

 

       Flash Player传递给Scout的每一条数据都是有代价的。除了执行您的内容,Flash Player必须花费时间绘制它自己和传递这些数据。这意味着当您用Scout调试时,Flash Player的行为相对于正常的执行有所不同。依据您所选择要收集的数据,这个不同之处可能会微不足道或者很明显。这种情况将取决于您试图应对的问题。
 

 

       在这篇文章里,您将了解Flash Player是如何绘制和传递数据给Scout,以及如何决定收集哪些数据。这将有助于您更准确的应对关于您的内容的中的行为和性能。通过更好地了解这些数字在Scout里都意味着什么,将增加您profiling时的信心。

 

需要注意的是,这不是Scout的界面指南,如果您不知道如何使用Scout,或者里面每个面板的作用,您可以阅读这篇文章getting started guide。

 

在Scout里获取从Flash Player发来的数据
 

 

       当您开始使用Scout,在您加载Flash内容的同时您将注意到Scout启动了一个新的会话和数据被传递了过来。这些数据被称为Telemetry。它是Flash Player在执行内容时收集的基本数据流。为了使之运转起来,Scout必须能够通知Flash Player传递哪些数据,以及Flash Player必须能够连接Scout和传递数据。
 

 

Scout 是如何通知Flash Player传递数据的?
 

 

       Scout是通过在您的主目录下一个叫.telemetry.cfg的文件通知Flash Player如何做的。这个文件里记录着Scout运行在那一台机器上,监听着那个端口,以及Flash Player需要收集那些数据(即您在Scout的 Settings for New Sessions面板里勾选的选项)。如果您的Flash Player和Scout运行在同一台机器,您根本不必去理会这个文件。在您修改任何设置的时候,Scout都会将其写入这个文件,而Flash Player会在加载新的SWF时去读取这个文件。您在一个已打开的会话里所改变的设置,将应用在新的会话里。
 

 

       如果您的Scout运行在不同的机器上,而您又想要Flash Player传递数据给它,这时您就需要手动的配置.telemetry.cfg文件。这点在getting started guide文章里已有说明如何操作。记住这一点,您需要配置Scout去监听您在这个文件里指定的端口。您可以在Scout的首选项对话框里设置。
 

 

       如果您打算在移动设备上调试Adobe AIR内容,您可以在合适的应用商店里下载iOS,Android,和Kindle的Scout Companion App。这个应用连接到一个Scout实例上,通过与Scout的通信确定您的数据配置。这个过程没有用到.telemetry.cfg,取而代之的是,这个companion app直接转发此信息给运行中的Adobe AIR实例,然后他们就知道要把哪些数据传递给哪里的Scout。

 

Flash Player是如何传递数据给Scout的?
 

 

       当Telemetry是可用的(即有一个.telemetry.cfg文件在您的主目录下),Flash Player在加载一个新的SWF时会尝试去打开一个TCP连接到Scout上。如果失败了,Flash Player会禁用Telemetry和继续运行,此时将不会有任何profiling的开销。如果连接成功了,Flash Player开始传输数据到Scout的一个新会话上,Scout在呈现给您之前会解析这些被称为AMF的一种压缩的二进制格式数据。当您保存一个FLM文件时,您其实已经保存了Flash Player传递过来的原始数据,同样的是二进制格式。这意味着,当您打开一个FLM文件时,Scout其实只是在快速的把从您的内容里获得的数据重新播放出来。
 

 

决定收集哪些数据


        Scout接收的每一块数据都是通过Flash Player.传递过来的。如果您请求更多的数据,Flash Player将不得不增加更多的额外工作,从而将影响您的内容的性能表现。正因为如此,当您决定要收集哪些数据时,考虑这些type of question是很重要的,从Settings for NewSessions(新会话的设置)知道那些选项应该勾上(如图1)。
 用Adobe Scout精确的分析_第1张图片

图1 使用在Scout里的“新会话的设置”面板,选择您想要获得的数据。

 

       如果您想测量性能,您需要限制自己去收集低开销的数据:基本Telemetry、ActionScript取样器、CPU使用率。这些都是经过精心设计的,相比执行您的内容,Flash Player只花费了很少的时间去收集和传递这些数据给Scout。这意味着当您正在寻找性能问题时,您可以相信在Scout上看到的时间测量,这点是必不可少的!
 

 

       如果您想收集关于渲染的详细信息,您也可以勾选这个带来高开销的设置:显示列表渲染详细信息和Stage3D记录。这些对于调试图形的相关问题非常有用,他们分别让您看到每一帧上绘制的显示对象和Stage3D的命令执行的精确序列。这种详细程度是有代价的。因为Flash Player需要花费更多的时间去收集和传递这些数据给Scout,从而减慢了您的内容。如果您决定收集这些数据的话,您在Scout上看到的时间信息将是不准确的。由于Flash Player做了这些额外的工作,导致某些执行时间将会比实际显示得更长。不仅如此,因为一些活动对象比其他绘制的更详细,使得这些结果将会有所偏倚。
 

 

       请记住,如果您想得到准确的性能数据,请保持低开销!您同时不能得到详细的渲染数据和准确的时间测量。这就像在试图采访飞人博尔特而他正在100米竞赛中。当您用麦克风催促他时,他不会打破任何世界纪录!

 

       基本Telemetry和ActionScript取样器

 

如果您对性能方面感兴趣,您应该开启“基本Telemetry”和“ActionScript取样器”这两设置。虽然刚开始时有点混乱,但是他们准确的收集着两种不同类型的数据。当Flash Player执行您的内容时,有两个核心在一起运转着:
 

       Flash Player,做着实际的工作,并给外界提供接口。在其他任务中,它渲染着屏幕、播放声音和视频,同时处理着输入和联网事件。

   您的SWF,包括一大部分基本的静态资源,比如图片,还有动态资源,比如scripts and timelines(脚本和时间轴)。这些动态字体通过FlashPlayer来执行,并告诉它需要做些什么。为了只在关键的地方测量自己,Flash Player改写了代码库。他测量在执行关键的代码块时花费了多久,和关键的数据结构占用了多少内存。在这里一个关键词是"key"。如果Flash Player在每个单独的方法里都计算花费的话,这将产生太多的开销,同时比在非调试的情况下运行得更加的慢。因为就如大家所知的,它仅仅测量活动对象就需要显著的时间量,相比而言这些测量的开销是可以忽略不计的。换言之,您在Scout上看到的时间值是尽可能准确的。这些数据被称为基本Telemetry,它被用于在Scout上绘制帧时间轴、总结、活动序列、和首要活动面板。请注意,FlashPlayer仅会报告花费大于5ms的活动,任何低于这个点的活动都不会在Scout上显示。Scout还显示关于您的SWF中的ActionScript 3执行信息。当您开启ActionScript取样器设置时,您可以在ActionScript面板看到这些信息。这些数据与基本Telemetry是非常不同的。Flash Player无法提前知道您的代码将是什么,因此它不能进行提前检测。还有,如果FlashPlayer记录和发送每一个函数调用给Scout,它会增加太多的开销从而影响其准确性。Flash Player 会从执行中的ActionScript取样,每一毫秒,它都会从调用堆栈里获取快照,以此代表在该特定的时间点您的代码都做了些什么。在Scout上的ActionScript面板里,这些数据收集于您所选择的帧范围,让您看到在这段时间里,每个函数的平均花费。这些数据是基于统计采样的(只显示到毫秒,因为这是采样频率),如果您观测的数据越多,得到的结果会更准确(例如,在选择更多的帧时)。您应该时刻注意在ActionScript面板上的数据质量指标。一个悲伤的小脸(如图2),意味着您没有查看足够的数据用于采样统计,而一个开心的小脸(如图3),意味着那些数据是准确的,足以让您决定哪些函数是代价最高的。

  

图2 当只有很少的样本时请注意这个ActionScript面板。

图3 选择足够的数据使之结果符合采样统计

 

理解测量和采样的区别是很重要的,因为这两种类型的数据具有不同的精度。想象一下,您在坐过山车,需要衡量全程持续了多久。使用测量的方法,您需要携带一个秒表,在出发前启动它,直到终点才停止(如图4)。这可以给您一个相当准确的结果(例如,精确到秒),但它需要一定的时间来启动和停止秒表,记下每个测量。如果您在每一次乘坐时这样做,它会让您在主题公园的一天过得更长一点(假设您每次只能做一件事)。在这个例子中,让我们告诉您测量23秒的这段时间。

用Adobe Scout精确的分析_第2张图片

图4 使用仪器测量一段时间

 

以采样为例,而不是带着个秒表,您设置了一个摄像头每10秒拍摄这段车程(或任何您选择的时间间隔)(如图5)。这是侵扰程度较低的,因为您不必随身​​携带一个秒表进行测量,但它也不够精确。在这个过山车通过后,您看到多少张移动照片(这种情况下,两个),然后乘以照片之间的时间间隔(在这种情况下,10秒)。这给了您一个持续20秒的近似乘坐的时间。

用Adobe Scout精确的分析_第3张图片

图5 采用抽样测量持续时间的过程。

采样相比测量方法来说不太精确,但您重复的时间越长(多次坐过山车),相对误差会比较小。这就类似于ActionScript取样器的工作原理。“照片”是调用堆栈的快照(称为样本),而且他们每毫秒都在收集。

在Scout里一个有用的特性是,它有能力通过一个真正有用的方式结合这两种类型的数据。例如,在Flash Player的代码层里检测用于接收鼠标的事件,使之显示了在基本Telemetry。这给了您一个微秒的精确测量过了多长时间来处理这个事件。如果您有一个ActionScript 3的事件处理程序,则Flash Player在您的代码执行时,还收集它的样本。在Scout当您选中首要活动面板,单击事件,Scout将过滤ActionScript面板,它仅显示这个事件处理的正在运行的代码(如图6)。

图6 使用首要活动面板测量的数据,过滤ActionScript面板中的采样数据。

 

在总结面板中结合了基本Telemetry和ActionScript取样器中的数据。在此面板中的数据大多来自基本Telemetry,但如果您已经开启ActionScript取样器,您可以展开ActionScript类,从中查看消耗最大的点在那个包里。只要记住,这些数据是近似的,因为它是通过抽样计算得来的(不像在总结面板中的其余部分的数据)。用“≈”符号来表示(如图7)。

用Adobe Scout精确的分析_第4张图片

图7 总结面板显示测量数据和采样数据

 

以下简要介绍了两种类型的数据:

基本 Telemetry(活动序列面板,首要活动面板),提供给您Flash Player都做了什么时序测量。Flash Player通过轻量测量方式提供这些数据,它具有微秒级的精度。

ActionScript取样器(ActionScript面板),给您的ActionScript 3代码做着定期的快照。每毫秒,它需要调用堆栈的一个样品,并聚集该数据随着时间的推移,向您展示每个函数平均所花费的时间百分比。时间是近似的,但选择的帧越多得到的更准确,所以一定要寻找开心的小脸!

CPU使用率

如果您打开CPU使用率设置,Flash Player将采取定期测量的方式,获得它使用了多少CPU时间。它获取该数据是通过查询操作系统,因此它对应于OS X的活动监视器,或者Windows的任务管理器。它是低开销的,所以在您要调查您的内容的性能时可以开启它。

显示列表渲染详细信息

如果您在您的内容里使用了Flash显示列表,那么这个“显示列表渲染详细信息”的设置,让您可以记录关于每个渲染通道上的屏幕重绘和每个显示对象的渲染消耗时间的详细信息。在Scout的“显示列表渲染”面板您可以看到这些信息。特别是,热图模式以图形方式显示消耗最长的屏幕重绘渲染。

收集该数据的开销取决于有多少对象在显示列表上。这可能会有相当大的开销,所​​以您不应该在看您的内容的整体性能时开启这个设置,只有在相对的时间来呈现每

个DisplayObject。一个良好的工作流程如下:

 

1.  仅在基本Telemetry启用时调试您的内容,并查看花了多少时间在做显示列表渲染,相比其他的活动,如执行中的ActionScript。

 

2.  如果显示列表渲染是一个问题(因为它占用了太多的时间),然后打开显示列表渲染详细信息设置,重新调试您的内容。然后您可以使用Scout的显示列表渲染面板,确定问题的根源。

Stage3D记录

如果在您的内容里使用了Stage3D(无论是直接的,或使用一个框架,如Starling或Away3D),Scout可以给您提供详细的正在运行的信息。在Flash Player中的Stage3D API是可测量的,所以它可以发送每一个Stage3D的API调用和参数到Scout上。然后,在Scout里您可以逐条命令重放,看每次一个绘制调用是如何呈现在每个场景的。能够这样做是因为Scout里内嵌了一个Stage3D引擎的副本。

开启Stage3D记录设置会产生一个巨大的数据量,并带来高开销。这是因为Flash Player要送每个buffer,texture和AGAL程序到Scout上,以及您对Stage3D API每个函数调用的详细信息。这是一个很大的数据量,还有收集和发送它会减慢您的内容的执行。在您要调试渲染问题的时候,开启Stage3D记录有好处的,但您永远不应该调试性能时开启它。如果您尝试开启它时,ActionScript面板甚至会警告您(如图8)。

图8  如果您开启了Stage3D记录,在ActionScript面板会有这个警告

 

如果您关心性能,您应该进行以下步骤:

 

在仅有基本Telemetry和ActionScript取样器启用时调试你的内容。在Scout的总结面板中,展开ActionScript类别来查看Stage3D API花费了多少比例的时间。ActionScript面板会显示那个具体的函数调用花费的时间最长。

 

您可以开启Stage3D记录,如果您的内容中的Stage3D API花费了太多的时间。在Stage3D渲染面板,Scout会显示每一个Stage3D API调用您的内容的操作。这对于寻找性能问题的原因,如产生太多的重绘调用或频繁的改变GPU状态往往是非常有用的。

 

如果您需要调试一个渲染问题,如一个AGAL程序没有按照您预期的方式工作,您可以直接跳转到第二步。但请记住,当您想提高您的内容的表现时,您应该先找出Stage3D是否是问题的一部分,然后再试图优化它!

 

由于Stage3D记录非常容易在几分种里产生GB级的内存数据。Scout有一个“延时记录”模式,因为您可能要在您的内容已经运行了一段时间,发生了渲染问题才调试(例如,确定22级的dragon boss为什么没有阴影)。如果您将记录设置由“直接”更改为“延时”,Flash Player将和以前一样发送相同的详细Stage3D的数据,但它不会加载到Scout的内存中。当您在Stage3D渲染面板单击“开始记录”,Scout只将需要的数据加载到内存中(如您的模型和贴图)。这使得您可以在不使用尽可能多的内存的情况下,重复测试这些命令。
 

 

在Scout里获得准确数据的技巧

 

您已经明白为什么选择正确的数据设置对于用Scout准确地调试是这么的重要了。但是你的调试环境也是重要考虑因素。如果您不这样做,您可能得到非常误导性的数据,并把时间浪费在试图解决一个不一定真的存在的问题!在用Scout做性能分析时,这里有一些重要的提示:

 

使用Flash Player的“发行版本”做分析。对于其他版本,如调试版(debugger),具有不同的性能特点。

 

使用“SWF的发布版本”做分析。调试版的SWFs运行要慢得多,因为为了帮助您调试您的内容,它们的ActionScript字节码设计得很重量级。

预计您的用户将使用的相同“硬件、操作系统和浏览器”做分析。您的内容可能在您的超快速的开发机器上运行良好,但对于普通用户将如何运行?

在您做分析时不要运行其他程序或SWFs。这些会干扰Flash Player的测量,使得它可能最终报告了误导性的信息。尽可能的减少运行的程序,并关闭任何其他您可能打开的浏览器选项卡。

当在做分析时避免使用VMware或设备仿真器(device emulators)。如果可能的话使用一个本地的机器或设备,因为它的性能特点将最接近您的用户体验。如果您需要使用VMWare,然后确保将其设置为使用一个以上的核心。如果它只有一个核心的话,在用Scout时它将无法正常的工作(这是一个已知的问题)。

如果您在移动设备上做分析,请确保您的网络有足够的带宽用于Flash Player发送它的数据给Scout。如果没有,网络连接将成为一个瓶颈,这将在Scout带来误导性的信息。

下一步阅读方向

鉴于您了解了Scout是如何收集这些数据的,您可以更准确和更有效的分析您的内容。 请记住,仅收集您需要的数据来解答您目前正在处理的问题。盲目的打开所有的设置最终将扭曲这些数据,并可能导致您最终优化了错误的事情!

一旦您已经确定了性能问题,下一步就是要确定为什么这里会有问题,和它都做什么。要了解更多的有关FlashPlayer如何运作,和要怎么处理Scout显示给您的信息,请参阅Understanding Flash Player with Adobe Scout.

原文链接:用Adobe Scout精确的分析

转载于:https://www.cnblogs.com/atong/archive/2013/02/04/2892220.html

你可能感兴趣的:(运维,移动开发,操作系统)