原文:http://www.adobe.com/cn/devnet/scout/articles/accurate-profiling-with-scout.html
开始使用 Scout 时,您会注意到只要开始加载任何 Flash 内容,就会打开一个新会话并开始收到数据。此数据称为遥测数据 。基本上它就是 Flash Player 在执行内容时获取的一个度量数据流。为此,Scout 必须能够告诉 Flash Player 发送何种数据,Flash Player 必须能够连接到 Scout 并发送数据。
Scout 如何告诉 Flash Player 发送数据?
您的主目录中有一个名为 .telemetry.cfg
的文件,Scout 使用它告诉 Flash Player 做什么。这个文件存储 Scout 正在哪个机器上运行、使用的端口和 Flash Player 应收集的数据的相关信息(也就是您在 Scout 中的Settings for New Sessions 下选择的内容)。如果使用相同的机器运行 Scout 与 Flash Player,应该无需接触此文件。只要您更改了任何设置,Scout 就会向该文件写入相应的内容,Flash Player 只要加载一个新的 SWF 就会读取该文件。在 Scout 中启动一个会话后,您将无法更改设置;这些更改仅应用到新会话。
如果在不同的机器上运行 Scout,而且希望 Flash Player 向它发送数据,就需要手动设置 .telemetry.cfg
文件。 入门指南 入门指南解释了具体的操作方法。请记住,您需要配置 Scout 在您于此文件中指定的相同端口上进行侦听。可在 Scout 中的 Preferences 对话框中设置此端口。
如果希望在一个移动设备上分析 Adobe AIR 内容,您可从合适的应用程序商店下载针对 iOS、 Android 和Kindle 的 Scout Companion App。该应用程序连接到一个 Scout 实例,与 Scout 通信来确定您选择了哪些数据设置。此过程不会使用 .telemetry.cfg
。相反,这个配套应用程序直接将此信息转发给正在运行的 Adobe AIR 实例,所以这些实例知道将哪些数据发送给 Scout 以及在何处发送它们。
Flash Player 如何将数据发送给 Scout?
启用 Telemetry 后(也就是说,您的主目录中有一个 .telemetry.cfg
文件),只要 Flash Player 加载一个新的 SWF,它就会尝试打开与 Scout 的一个 TCP 连接。如果连接失败,Flash Player 会禁用 Telemetry 并继续运行,您的内容不会遇到任何分析开销。如果连接成功,Flash Player 会开始向 Scout 传输数据,后者将其显示为一个新会话。系统以一种称为 AMF 的压缩二进制格式发送数据,Scout 会在呈现给您之前解析数据。保存 FLM 时,您实际上保存的是 Flash Player 发送的相同二进制格式的原始数据。这意味着当您打开一个 FLM 时,Scout 实际上只是快速重放它从您的内容中收到的数据。
Scout 收到的每部分数据都必须由 Flash Player 发送。您请求的数据越多,Flash Player 必须完成的额外工作就越多,因此对内容的影响就越大。为此,在决定收集哪些数据之前一定要考虑您希望回答的问题 类型, 这样才知道在 Settings for New Sessions 下选中哪些复选框(参见图 1)。
![图 1:使用 Scout 中的 Settings for New Sessions 面板选择您希望获取的数据。 图 1:使用 Scout 中的 Settings for New Sessions 面板选择您希望获取的数据。](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig01.png)
如果希望度量性能,您应限制为仅收集低开销数据:Basic Telemetry、 ActionScript Sampler 和 CPU Usage类别。这些类别经过了严格设计,所以和执行您的内容相比,Flash Player 只需尽可能少的时间收集数据并将其发送到 Scout。这意味着您可信任在 Scout 中看到的时间度量,这在查找性能问题时尤为重要!
如果希望收集有关渲染 的详细信息,也可选择具有高开销的设置:DisplayList Rendering Details 和 Stage3D Recording。这些设置对调试图形相关问题很有用;它们会分别让您看到在每个帧上绘制的 DisplayObject 以及 Stage3D 命令的准确执行顺序。但是,这种细节水平需要一定的代价。Flash Player 必须花多得多的时间来收集数据并将其传输到 Scout,这会降低您的内容的运行速度。如果决定收集此数据,那么在 Scout 中看到的计时信息将不准确。由于 Flash Player 正在执行额外的工作,因此一些执行时间看起来将比实际的要长。不仅如此,结果将具有偏差 ,因为一些活动的度量方式比其他活动更详细。
请记住,如果希望准确的性能数据,请保持低开销!您不能同时获得详细的渲染数据和准确的时间度量。这就像在乌塞恩 • 博尔特跑 100 米时对他进行采访。在您将话筒对着他时,他无法打破任何世界记录!
Basic Telemetry 和 ActionScript Sampler
如果对性能感兴趣,您应该打开 Basic Telemetry 和 ActionScript Sampler 设置。它们实际上会收集两种不同类型的数据,这两种数据最初可能引起混淆。Flash Player 执行您的内容时,有两个核心部分会协同工作:
- Flash Player,它执行实际的工作并与外部世界进行联系。除了其他工作,它还将内容渲染到屏幕并播放声音和视频,以及处理输入事件和网络。
- 您的 SWF,它基本而言是一组静态资源(比如图像)和动态资源(比如 脚本 和 时间轴 )。这些动态资源由 Flash Player 执行并会告诉它怎么做。
Flash Player 代码库是仪器化的 ,所以它可在关键位置度量自己的情况。它度量自己用了多长时间执行关键代码块,以及它的关键数据结构使用了多少内存。此处 “关键 ” 这个词很重要。如果 Flash Player 度量了它在每个函数中所花的时间,它将具有很高的开销,而且运行速度比未分析它时会慢得多。因为它仅度量已知会花大量时间的活动,所以这些度量的开销微乎其微。换句话说,您在 Scout 中看到的时间非常准确。此数据称为 Basic Telemetry ,Scout 在绘制帧时间轴时会使用它,Summary、Activity Sequence 和 Top Activities 面板中也会使用它。注意,Flash Player 仅报告所花的时间长于 5 微秒的活动;任何短于此时间的活动都不会在 Scout 中显示。
Scout 还会显示 SWF 中的 ActionScript 3 执行信息。打开 ActionScript Sampler 设置后,您就可以在 ActionScript 面板中看到此信息。此数据与 Basic Telemetry 有很大的区别。Flash Player 不会提前知道您的代码将是什么,所以它不能提前测量。而且如果 Flash Player 打算记录每个函数调用并将它们发送到 Scout,会增加极大的开销,进而导致结果不准确。相反,Flash Player 在执行期间会对您的 ActionScript 进行抽样 。每隔一毫秒,它就会获取调用堆栈的一个快照 ,该快照表示您的代码在特定的时间点所做的操作。
在 Scout 的 ActionScript 面板中,会在您选择的帧范围上聚合此数据,让您看到在每个函数上平均花的时间比例。此数据仅是近似值 (它仅显示为最接近的毫秒数,因为这是抽样频率),但随着您查看的抽样越多(比如选择更多的抽样),它会越来越准确。您始终应该注意 ActionScript 面板中的数据质量指示器。沮丧的面部(参见图 2)会告诉您,您查看的数据量不足以使它具有统计意义,而高兴的面部(参见图 3)表示数据非常准确,您可用它确定哪些函数的开销最高。
![图 2:抽样太少时 ActionScript 面板中的警告 图 2:抽样太少时 ActionScript 面板中的警告](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig02.png)
![图 3:选择足够多的帧,让结果具有统计意义 图 3:选择足够多的帧,让结果具有统计意义](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig03.png)
理解测量和抽样之间的区别非常重要,因为两种类型的数据具有不同的准确度。想象您在一辆过山车上,希望测量它开了多长时间。使用测量 使用测量方法,您可手持一个秒表,在它启动时启动秒表,在它停止时停止秒表(参见图 4)。这可为您提供非常准确的结果(比如接近最近的秒数),但需要花时间启动和停止秒表,以及记录每次度量结果。如果每次坐过山车时都这么做,您的主题公园活动时间将更长(假设您一次只能做一件事)。对于此示例,假设您测量的时间为 23 秒。
![图 4:使用测量方法度量持续时间 图 4:使用测量方法度量持续时间](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig04.png)
借助抽样 方法,无需携带秒表,您设置一个照相机每 10 秒(或您选择的其他间隔)对过山车拍一张照片(参见图 5)。这更加轻松,因为您无需手持秒表并执行度量,但它也不太准确。游玩结束后,您查看在行进过程中拍摄的照片(在本例中为 2 张)并乘以每张照片之间的时间间隔(在本例中为 10 秒)。这为您提供了大约 20 秒的游玩持续时间。
![图 5:使用抽样方法度量持续时间的过程。 图 5:使用抽样方法度量持续时间的过程。](http://www.adobe.com/content/dotcom/cn/devnet/scout/articles/accurate-profiling-with-scout/_jcr_content/articlecontentAdobe/image_3.adimg.mw.400.png/1364883654458.png)
抽样方法的准确性要低于测量方法,但您重复抽样的时间越长(多次乘坐过山车),相对误差会更小。这类似于 ActionScript Sampler 的做法。 “照片” 是调用栈的快照(称为抽样 ),它们每隔几毫秒创建一次。
Scout 中一项很有帮助的功能是以真正有用的方式将两种类型的数据组合 在一起。例如,Flash Player 中接收鼠标事件的代码是仪器化的,所以会在 Basic Telemetry 中显示它。这为您提供了对处理此事件所花时长的微秒级精度的度量。如果拥有 ActionScript 3 事件处理函数,那么 Flash Player 在执行期间还会收集代码的抽样。在 Scout 中,转到 Top Activities 面板并单击事件时,Scout 将过滤 ActionScript 面板,仅显示在处理这个特定事件期间正在运行的代码(参见图 6)。
![图 6:使用 Top Activities 面板中测量的数据对 ActionScript 面板中抽样的数据进行过滤。 图 6:使用 Top Activities 面板中测量的数据对 ActionScript 面板中抽样的数据进行过滤。](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig06.png)
Basic Telemetry 和 ActionScript Sampler 数据也组合在 Summary 面板中。此面板中的大部分数据都来自 Basic Telemetry,但如果打开了 ActionScript Sampler,您可扩展 ActionScript 类别,详细查看其中哪个包花了最多的时间。请记住,此数据是近似值,因为它是通过抽样计算的(不同于 Summary 面板中的其他数据)。这使用 “≈” 符号表示(参见图 7)。
![图 7:Summary 面板显示了测量的数据和抽样的数据 图 7:Summary 面板显示了测量的数据和抽样的数据](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig07.png)
以下是两类数据的总结:
- Basic Telemetry (Activity Sequence 面板、Top Activities 面板)为您提供了 Flash Player 所执行操作的时间度量值。该数据由 Flash Player 的轻量型测量仪器获得,精确到微秒。
- ActionScript Sampler (ActionScript 面板)获取 ActionScript 3 代码所执行操作的定期快照。每隔几毫秒,它就获取调用栈的一次抽样,不断聚合此数据以显示您在每个函数中平均花费的时间比例。时间是近似值,但会随着您选择的帧越多而变得越准确,所以一定要确保看到高兴的面部图案!
CPU Usage
如果打开 CPU Usage 设置,Flash Player 将获取它使用的 CPU 时间的定期度量值。它通过查询操作系统来获取此数据,所以它对应于您在 OS X 上的 Activity Monitor 或 Windows 上的任务管理器中看到的内容。它的开销很低,所以您可在分析内容性能时打开它。
DisplayList Rendering Details
如果在内容中使用了 Flash DisplayList,那么 DisplayList Rendering Details 设置允许您记录有关在每个渲染通道中重新绘制了屏幕哪些部分的详细信息,以及渲染每个 DisplayObject 所花的时间。可在 Scout 的 DisplayList Rendering 面板中看到此信息。具体来讲, Heat Map 模式图形化地显示哪些屏幕部分的渲染时间最长。
收集此数据的开销取决于 DisplayList 中的对象数量。这可能需要很高的成本,所以不应在打开此数据设置时查看内容的总体性能;仅查看渲染每个 DisplayObject 所花的相对时间。一个出色的工作流如下所示:
- 只有启用 Basic Telemetry 后才会分析您的内容,查看它花了多长时间执行 DisplayList Rendering,并与其他活动对比,比如执行 ActionScript。
- 如果 DisplayList Rendering 存在问题(因为它占用了太长时间),可打开 DisplayList Rendering Details 设置,并再次分析您的内容。然后可使用 Scout 的 DisplayList Rendering 面板确定问题的来源。
Stage3D Recording
如果在内容中使用了 Stage3D(无论是直接使用,还是通过 Starling 或 Away3D 等框架使用),Scout 可提供有关正在执行的操作的详细信息。Flash Player 中的 Stage3D API 是仪器化的,所以它可将每个 Stage3D API 调用及其参数发送给 Scout。然后可在 Scout 内重放这些命令,查看每个场景的渲染方式,一次查看一个绘制调用。可以这么做是因为 Scout 自身内有一个 Stage3D 引擎副本。
打开 Stage3D Recording 设置会生成大量数据,具有很高的开销。这是因为 Flash Player 必须将每个缓冲区、纹理和 AGAL 程序发送给 Scout,还要发送您对 Stage3D API 执行的每次函数调用的详细信息。这包含大量数据,而且收集和发送它将减缓您的内容的执行速度。如果希望调试渲染问题,可以打开 Stage3D Recording,但绝不应在启用此数据设置后执行性能分析。即使您只是尝试这么做,ActionScript 面板也会发出警告(参见图 8)。
![图 8:打开 Stage3D Recording 后,ActionScript 面板中的警告 图 8:打开 Stage3D Recording 后,ActionScript 面板中的警告](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/scout/articles/accurate-profiling-with-scout/accurate-profiling-with-scout-fig08.png)
如果担忧影响性能,应执行以下步骤:
- 仅在启用 Basic Telemetry 和 ActionScript Sampler 的情况下分析内容。在 Scout 的 Summary 面板中,展开 ActionScript 类别并查看 Stage3D API 中所花的时间比例。ActionScript 面板将显示哪个具体的函数调用花的时间最常。
- 如果您的内容在 Stage3D API 中花了太长的时间,您可打开 Stage3D Recording 。Scout 将在 Stage3D Rendering 面板中显示您的内容所做的每个 Stage3D API 调用。这对查找性能问题的根源很有用,比如发出了太多绘制调用或太频繁地更改 GPU 状态。
如果需要调试渲染问题,比如 AGAL 程序没有按预期运行,可直接跳到第二步。但是请记住,希望改善内容的性能时,首先应该确定 Stage3D 是不是问题的一部分,然后再尝试优化它!
因为 Stage3D Recording 会将大量数据发送给 Scout,所以很容易在几分钟内耗尽数 GB 的内存。由于您可能希望在内容运行一段时间后调试渲染问题(例如,确定为什么 22 级的巨龙没有影子),所以 Scout 提供了一种延迟记录 模式。如果将 Recording 设置从 Immediate 改为 Delayed ,Flash Player 会发送与以前相同的详细 Stage3D 数据,但在 Scout 中不会将这些数据加载到内存中。单击 Stage3D Rendering 面板中的 start recording 时,Scout 仅将必要的数据加载到内存中(比如您的网格和纹理)。这让您能够从那一刻向后延迟命令,而无需使用太多内存。
您已了解为什么选择正确的数据设置来使用 Scout 进行准确的分析很重要。但同样至关重要的是考虑您分析的环境 。如果未考虑,最终可能得到非常有误导性的数据,以及将时间浪费在修复并不真正存在的问题上!以下是在使用 Scout 执行性能分析时要考虑的一些重要技巧:
- 使用 Flash Player 的发行版 进行分析。其他版本(比如调试版)具有不同的性能特征。
- 使用 发行版 SWF 。调试版 SWF 的运行速度慢得多,因为它们的 ActionScript 字节代码会经过大量测量,从而帮助您调试内容。
- 使用您预计用户将使用的相同硬件、操作系统和浏览器 来进行分析。您的内容可能在超快的开发机器上能很好地运行,但它在普通用户的机器上的运行状况如何?
- 在分析期间不要运行其他程序或 SWF 。这会影响 Flash Player 所执行的测量工作,最终会导致报告有误导性的信息。运行尽可能少的程序,关闭您可能打开的任何其他浏览器标签。
- 在分析时避免使用 VMware 或 设备模拟器 。如果可能,使用本地机器或设备,因为它的性能特征最接近您的用户将体验到的性能特征。如果需要使用 VMware,请确保将它设置为使用多于一个核心。如果仅有一个核心,它将无法正确运行 Scout(这是一个已知问题)。
- 如果在移动设备上进行分析,请确保您的网络拥有足够的带宽 供 Flash Player 向 Scout 发送数据。如果没有,网络连接将成为瓶颈,这将在 Scout 中为您提供有误导性信息。