Scout はめっちゃ格好いいデータを表示してくれるけど、初めて見る時は細かくて分かりづらいところがあります。例えば「アクティビティシーケンス」と「上位アクティビティ」のパネルはどう違う?というかそもそもアクティビティって何のこっちゃ?などの質問をよく目にします。Scoutの内臓的な仕組みがわかるとデータがよりわかりやすくなるので、ここで軽く説明しようと思います。
(というより、Scoutのカスタムメトリックの記事を最近書くことになり、そのために勉強したけど記事に入らなかった情報をここにまとめようと。)
基本の基本
Scoutプロファイリングを開始すると、FlashプレーヤーがScoutとのソケットを作り、パフォーマンスに関するデータを送信する。そのデータの内容は主に、アクティビティの「名前・開始時間・終了時間」になる。(他には、トレースされた文字列、Stage3Dに使われたテキスチャーなども送信される。)Scoutがそのデータを受信し、分析を行い、分かりやすく(?)表示する。
アクティビティとは
Flashプレーヤーで行われたそれぞれの処理を、Scoutが「アクティビティ」として認識する。アクティビティの重要なポイントは:
- 名前、開始時間、終了時間というプロパティーが必ずある。アクティビティによっては他のもある。
- ネスティング(入れ子構造)される。つまり、アクティビティAを実行している間にアクティビティBが実行されると、BがAの「子アクティビティ」と認識する。
- 分析により、各アクティビティには「単体時間」と「合計時間」というプロパティーもある。
- 合計時間は単純にそのアクティビティの(終了時間 - 開始時何)である。
- 単体時間はそのアクティビティのみの処理時間。つまり、子アクティビティの処理時間は親アクティビティの単体時間にカウントされない。
- Telemetry APIを使うとカスタムスパンメトリックをScoutに送信出来るが、これはアクティビティと完全に同じ物。既存のアクティビティと同様に扱われる。
具体例
例のほうが分かりやすいので、仮にFlashが下記のようなデータをScoutへ送信することにしよう:
名前 開始時間 終了時間 |
Scoutが上記のようなデータを受信すると、下記のように分析する:
名前 単体時間 合計時間 |
というわけ。ちなみにBがAの子アクティビティであることは、Scoutに送信されるデータでは明確にされる情報ではなく、時間データから推察される情報である。(ところでTelemetry APIを使ってきれいにネスティングされないアクティビティ(A開始→B開始→A終了→B終了、など)を作ると、Scoutがエラーを出してセッションを終了するよ。良い子はマネしないでね!)
(厳密にいうと、Flashからスカウトへ送信されるのは開始時間と終了時間ではなくて、終了時間と実行時間。結果同じだが。)
いよいよデータの読み方
上記で説明した「ネスト化アクティビティ」はScoutのそれぞれのパネルの裏にあるが、パネルによって表示の仕方が変わる。直接データを見るには、「アクティビティシーケンス」パネルが各アクティビティの詳細を、ネスティングされた状態で表示する:
同じアクティビティが数回発生しても別々に表示される。デフォルトでは表示しないが、コラム名を右クリックをすると「開始時間」コラムを表示するように設定できる。アクティビティの順番を確認したい場合、開始時間でソートしよう。
ちなみに各アクティビティの単体時間が0.5ms以下である場合、通常では表示されない。普段は無視して良いので。全てのアクティビティを見るにはパネル左上の「小項目」ボタンを押す。(上記の画像で「関数」というコラム名の直上にあるやつ。)アクティビティシーケンスパネルは名前の通り、シーケンス(順番)でデータを表示するので1フレームのデータしか表示しない。複数フレームのデータをまとめて表示するのは「上位アクティビティパネル」の役割である。裏にあるデータはシーケンスパネルは完全に同じだが、数フレームの数字をまとめているため、アクティビティの順番(開始時間)とネスティングの状態が消える。そのかわり長い期間の全体的なデータを確認できる。
一見分かりづらいかも知れないが、概要パネルのデータは上位アクティビティパネルの「単体時間」データその物である。ただ概要パネルでは大まかなカテゴリにまとめられている。(どのアクティビティがどのカテゴリに入るかは色でわかる。)
ActionScriptパネルについて
ActionScriptパネルで見られるデータは今までの説明と完全に違うものである。なぜかというと、Flashが実行される関数を全てアクティビティとしてScoutへ報告しようとしたら、そのデータ量が多すぎてコンテンツのパフォーマンスが分からなくなる。
そのため、Flashプレーヤーが1ms毎にスクリプトVMのコールスタックをScoutに送信し、ScoutがそのデータからASパネルに見えるデータを推察する仕組みとなる。例えば、下記のようなコールスタックデータだとしたら:
時間 コールスタック |
関数Cの処理時間がおよそ2msだったと推察できる。しかし関数Cが1回呼ばれて2msでリターンしたのか、2msの間に数回呼ばれたのかは不明なのでそこまでの詳細データはASパネルでは反映されない。
以上、Scoutの内臓の仕組みの説明でした。では使いこなせるように遊んでみてください!分かりづらいところがあればコメント欄やツイッターでご連絡を。