了解 Adobe Scout 收集和使用的数据
Adobe Scout 提供了大量美丽的数据供您查看,但解读这些数据并非总是简单明了。本文介绍了 Scout 在幕后收集的数据以及它如何使用该数据来创建所有漂亮的图片,以便您可以更轻松地理解所发生的情况。
启动分析会话时,Flash Player(或 Adobe AIR)会打开与 Scout 的套接字连接并开始发送数据。Scout 的主要面板中提供的大部分数据都是所定义的活动的名称和计时详细信息。(除了活动之外,还有跟踪语句、Stage3D 命令和纹理,以及一些其他内容。)Scout 将分析这些活动详细信息并生成其图表和图形。
注意:为简单起见,本文引用了由 Flash Player 发送给 Scout 的数据,但本文也适用于由 Adobe AIR 发送给 Scout 的数据。
在 Scout 中,活动是与某个特定功能相关联的时间块。Scout 中的活动具有以下特征:
- 每个活动都具有名称、开始时间和结束时间。某些活动还具有其他参数。
- 活动可以嵌套。如果活动 A 在活动 B 之前开始并且在活动 B 完成后结束,则 Scout 会将 B 视为 A 的子活动。
- Scout 根据它所获得的计时数据计算每个活动的总时间(total time)和自身时间(self time)。总时间是指活动的开始时间和结束时间之间的时间量。自身时间是指在该活动上(但不包括在其子活动上)花费的时间。换言之,活动的自身时间是它的总时间减去它的直系子活动的总时间。
如果您已了解 Scout 的自定义遥测 API(我之前在通过 Adobe Scout 自定义遥测中介绍过),则活动非常像自定义跨度指标,只是对它们的处理方式有一些微小的差异。
假设 Flash Player 将表 1 中的活动数据发送到 Scout。
注意:为绝对准确,Flash Player 不向 Scout 发送每个活动的开始和结束时间,而是发送结束时间和持续时间。但结果是相同的。
表 1:发送到 Scout 的示例活动数据
活动名称 | 开始时间 | 结束时间 |
A | 1.0 | 8.0 |
B | 5.0 | 7.0 |
C | 8.0 | 9.0 |
Scout 将使用此数据来计算自身时间和总时间,如表 2 中所示。
表 2:您在 Scout 界面中将会看到的示例数据
名称 | 自身时间 | 总时间 |
A | 5.0 | 7.0 |
-> B | 2.0 | 2.0 |
C | 1.0 | 1.0 |
如您所看到的,Scout 会根据计时数据推测活动 B 是活动 A 的子活动。顺便说一句,如果您使用自定义跨度指标 API 来定义非嵌套的活动(例如,B 在 A 期间开始但在其之后结束),则在 Scout 中查看该数据将会生成错误或者只是不会显示数据。因此,在定义您自己的嵌套指标时,请注意按照这些事件的开始顺序的反向顺序来结束这些事件。
牢记前面的解释,那么现在解释 Scout 中显示的数据应该会容易一点了。首先,在 Activity Sequence 面板中,会列出 Scout 知道的有关单个帧的所有活动,以及它们保持未变的嵌套关系(参见图 1)。
您甚至可以看到每个活动的开始时间,但在默认情况下该功能被关闭,因为它通常没有用处。(右键单击列标题可以更改哪些标题可见。)
注意:Scout 通常会筛选掉总时间小于 0.5 ms 的活动。要切换此行为,请单击 Hide Small Items 按钮(显示在图 1 的左上角)。
另一方面,Top Activities 面板忽略了活动的开始时间和嵌套关系,以便它可以显示多个帧的聚合数据。在该面板中,同一活动的多个实例被分组到一起(按照活动名称),而不是像在 Activity Sequence 面板中那样显示多次,因此 Scout 会指出活动在所选的时间跨度内发生了多少次。(参见图 2)。
这两个面板背后的数据是相同的;它们只是对该数据进行了封装并且以不同的方式显示。了解这些面板背后的数据有助于更明确地理解这些含义。例如,当某个 ActionScript 函数调用 BitmapData.draw()
或类似的 API 时,将会调用 Flash Player 渲染器。由于渲染在 ActionScript 执行之后开始并且在其结束之前结束,因此,Scout 会将其视为 ActionScript 活动的子活动。但是,只有在保留了嵌套信息的 Activity Sequence 面板中检查时才会看到这一情况。如果您查看 Top Activities 面板,所有活动都将被分组到一起,无论它们是由 ActionScript 触发的还是由 Flash Player 自动执行的。
最后,这可能不是一目了然的,但是在 Summary 面板中为每个条目显示的时间是相关活动的自身时间(参见图 3)。Summary 面板将活动分组为多个预定义的类别,并且为每个类别显示自身时间的总和。(查看哪个活动名称属于哪个类别的最简单方法是查看 Scout 使用的颜色。)
Scout ActionScript 面板中显示的数据与迄今为止讨论的所有事物完全不同。这是因为,如果 Flash Player 在每次调用 ActionScript3 函数时都向 Scout 发送一个活动,则分析开销可能会使处理速度变得极为缓慢。因此,Flash Player 大约每毫秒对调用堆栈进行采样,并且 Scout 将推测正在发生的情况。例如,考虑 Flash Player 发送表 3 中呈现的数据的情况。
时间 | 调用堆栈 |
1000 ms | FunctionA -> FunctionB |
1001 ms | FunctionA -> FunctionB -> FunctionC |
1002 ms | FunctionA -> FunctionB -> FunctionC |
1003 ms | FunctionA -> FunctionB |
通过该数据,Scout 可以估计出 FunctionC 大约执行了 2 ms。但是,不知道它在该期间内是执行了一次还是许多次 — Scout 只知道对于两次连续的采样,它位于调用堆栈的顶部。而且,在两次采样期间,FunctionC 可能已调用了 FunctionD(如果 FunctionD 快速返回)。这是 ActionScript 面板只能提供近似结果的原因,因此,要想获得更准确的结果,您应当选择一个较长的时间跨度。Scout 检查的样本越多,结果将越准确。
现在,您已了解了有关 Scout 使用的数据的更多信息,您可能希望阅读通过 Adobe Scout 了解 Flash Player,该文章介绍了 Scout 如何帮助您了解在 Flash Player 中发生的活动。祝您分析愉快!
由于我们正在向新评论系统迁移,所以当前的评论功能暂时关闭。在这过渡时期,请将您的意见和建议通过反馈表格提交。多谢您的理解。