必要条件
この記事に必要な予備知識
この記事の内容を十分に理解していただくには、Adobe Scoutの基本的な操作に慣れている必要があります。Scoutを初めてお使いになる場合は、最初に「Adobe Scoutファーストステップガイド」をお読みください。
ユーザーレベル
中級
原文 作成日: 2012/6/17
「Understanding the data Adobe Scout gathers and uses」
Adobe Scoutでは検証に役立つ膨大なデータが得られますが、それらのデータを解釈するのは必ずしも容易ではありません。この記事では、Scoutの仕組みを理解していただくため、Scoutがバックグラウンドでどのようなデータを収集し、それらのデータをどのように使用して美しい画像を作成しているかについて説明します。
プロファイリングセッションを開始すると、Flash Player(またはAdobe AIR)はScoutへのソケット接続を開いてデータ送信を開始します。Scoutのメインパネルには、定義されたアクティビティの名前とタイミング情報が表示されます(アクティビティの他に、traceステートメント、Stage3Dのコマンドとテクスチャなども表示されます)。Scoutはこれらのアクティビティデータを解析してグラフを生成します。
注意:説明をわかりやすくするため、この記事ではFlash PlayerからScoutへ送信されるデータについて説明します。ただし、ここに記述した内容はAdobe AIRからScoutへ送信されるデータにもあてはまります。
Scoutでは、一定時間内に実行された特定の機能をアクティビティと呼んでいます。Scoutのアクティビティには次のような特長があります。
- アクティビティにはそれぞれ名前、開始時刻、終了時刻があります。一部のアクティビティではその他のパラメーターも使用します。
- アクティビティはネスト構造にできます。例えば、アクティビティAを実行している間にアクティビティBを開始、終了した場合、アクティビティBはアクティビティAの「子」とみなされます。
- 取得したタイミングデータに基づいて、Scoutは各アクティビティの合計時間と単体時間を計算します。合計時間は、そのアクティビティが開始してから終了するまでの時間です。単体時間は、そのアクティビティのみの処理時間です。子の処理時間は含まれません。つまり、アクティビティの合計時間から直下の子アクティビティの処理時間を差し引いたものが、そのアクティビティの「単体時間」となります。
以前に「Custom telemetry with Adobe Scout(Adobe ScoutでのカスタムTelemetry)」で取り上げたScoutのカスタムTelemetry APIの場合、アクティビティはカスタムスパンメトリックと非常によく似ています。ただし、処理方法は多少異なります。
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を使用してネストしないアクティビティを定義する場合(例えば、「アクティビティA」の実行中に「アクティビティB」が開始され、「アクティビティA」が終了した後で「アクティビティB」が終了する場合など)、Scoutでデータを表示するとエラーとなるか、またはデータが表示されません。ネスト構造のメトリックを独自に作成するときは、開始時と逆の順序で終了してください。
Scoutのデータについてひととおり説明したところで、実際にデータを解釈してみましょう。まず、Activity Sequence(アクティビティシーケンス)パネルを見てください。このパネルには、単一フレームについてScoutが検出したすべてのアクティビティがリスト表示されます。ネスト構造もそのまま表示されます(図1を参照)。

各アクティビティの開始時刻も参照できます。ただし、この表示項目は通常あまり使用しないので、デフォルトでは非表示になっています(列の表示/非表示を切り替えるには、列タイトルを右クリックします)。
注意:通常、合計時間が0.5 ms未満のアクティビティは表示されません。すべてのアクティビティを表示するには、図1の左端にあるHide Small Items(小項目)ボタンをクリックします。
一方、Top Activities(上位アクティビティ)パネルではアクティビティの開始時刻とネスト関係が無視され、複数のフレームのデータがすべて表示されます。同じアクティビティが複数回発生した場合、Activity Sequence(アクティビティシーケンス)パネルにはそれらがすべて表示されますが、このパネルではインスタンスが(アクティビティ名ごとに)グループ化され、選択した期間内に発生した回数が示されます(図2を参照)。

どちらのパネルも元になっているデータは同じですが、集計方法と表示表示が異なります。これらのパネルの背後にあるデータを理解することで、その意味がより明確になります。例えば、ActionScript関数がBitmapData.draw()
または同様のAPIを呼び出すと、Flash Playerレンダラーが呼び出されます。ActionScriptの実行中にレンダリングが開始されて終了するので、レンダリングはActionScriptアクティビティの子アクティビティとみなされます。ただし、このアクティビティが表示されるのは、ネスト関係が示されるActivity Sequence(アクティビティシーケンス)パネルだけです。Top Activities(上位アクティビティ)パネルを開くと、ActionScriptに伴って実行されたのか、Flash Playerによって自動的に実行されたのかにかかわらず、すべてのレンダリングアクティビティがまとめて表示されます。
さらに、一見するとわかりにくいかもしれませんが、Summary(概要)パネルに表示される各項目の時間は、それに関連するアクティビティの単体時間に相当します(図3を参照)。Summary(概要)パネルではアクティビティが所定のカテゴリごとにグループ化され、それぞれの単体時間の合計が表示されます(各アクティビティ名がどのカテゴリに属するかは項目の色で確認できます)。

ScoutのActionScriptパネルに表示されるデータは、上記で説明したどのデータとも大きく異なります。ActionScript3関数が呼び出されるたびにFlash PlayerがScoutへアクティビティを送信すると、プロファイリングオーバーヘッドによってクロール処理が遅くなってしまいます。そのため、Flash Playerは1ミリ秒ごとにコールスタックをサンプリングし、Scoutはそのサンプリングデータを基にして状況を推測します。例えば、Flash Playerが表3に示すデータを送信するとします。
時刻 | 呼び出しスタック |
1,000 ms | 関数A -> 関数B |
1,001 ms | 関数A -> 関数B -> 関数C |
1,002 ms | 関数A -> 関数B -> 関数C |
1,003 ms | 関数A -> 関数B |
このデータから、関数Cの実行時間はおよそ2 msと推測できます。ただし、この時間内に関数Cが1回だけ実行されたのか、何度も実行されたのかはわかりません。このデータからわかるのは、連続する2つのサンプルの呼び出しスタックで関数Cが実行されたということだけです。さらに、この2つのサンプルの間に、関数Cが関数Dを呼び出している可能性もあります(関数Dがごく短時間で完了した場合)。このように、ActionScriptパネルには概算データが表示されるので、より正確な結果を得るには長い期間を選択する必要があります。収集するサンプルが多いほど、より正確な結果が得られます。
Scoutにどのようなデータが送信され、どのように処理されるかを理解したところで、次は「Adobe ScoutによるFlash Playerの把握」をお読みください。この記事では、Flash Playerでの処理状況をScoutで確認する方法を説明します。Scoutをプロファイリングに大いにお役立てください。
現在、新しいコメントシステムに移行中であるため、コメントの投稿は受け付けておりません。しばらくの間、ご意見やご感想をお寄せいただく場合は、フィードバックフォームをご利用ください。ご迷惑をおかけしますが、どうぞよろしくお願い申し上げます。