Adobe Scoutでは、Flash/AIRコンテンツをそのままプロファイリングするだけでも、各APIの処理時間など、様々なデータを確認できます。さらに、Scoutには「カスタムTelemetry」という機能があり、コンテンツ内の任意の状況をカスタムデータとして計測することができます。デフォルトのパフォーマンスデータとカスタムデータを合わせて確認すれば、より効率的にコンテンツを改善できるでしょう。

カスタムTelemetry機能には、「カスタムメトリック」と「カスタムスパンメトリック」の2種類があります。本記事では、これらの使い方と用途について解説します。

※ここでいう「メトリック」とは、計測や分析されるデータやイベントのことを指しています。Scoutがデフォルトで計測するFPS、関数の実行時間なども総合的にメトリックと呼ぶことができます。

※Scoutの基本動作や機能説明などについては「Adobe Scout ファーストステップガイド」をご覧ください。

 

カスタムメトリック:trace()、Telemetry.sendMetric()

コンテンツからカスタムメトリック(何が、いつ起きたかの情報)をScoutへ送信する方法は2通りあります。お馴染みのtrace()、もう1つがTelemetry.sendMetric()です。どちらのAPIも、任意のデータを指定し、そのデータをScoutで確認できます。機能的には似ていますが、Scoutでの表示され方が違います。APIは非常に簡単に利用できます。

myFunction( myValue++ ); trace( "何か面白いことがありました! " + myValue ); myOtherFunction( myValue++ ); Telemetry.sendMetric( "他にも面白いことがありました", myValue );

trace()のアウトプットは[トレースログ]パネルで確認できます。[フレーム]パネルでフレームを選択すると、そのフレームの内容に応じてトレースログが動的に更新されます。このためtrace()は、コンテンツのハイレベルな状況を表すメッセージ(例えば「レベル2開始」など)をトレースする際に便利です。[フレーム]パネルでクリック&ドラッグすれば、複数のフレームを選択でき、コンテンツの状況を示すイベントを楽に探せます(一度パネル上をクリックして、フレーム選択のつまみをドラッグすることでも複数選択できます)。

sendMetric()のアウトプットは[アクティビティシーケンス]パネルで確認できます。また[アクティビティ]パネルには、trace()のアウトプットも表示されます。

Scoutの現バージョン(1.0)では、sendMetric()に渡されたデータは、trace()のものと同様に表示されるだけです。そのためtrace()の方が、[トレースログ]パネルで確認できる分、sendMetric()より使い勝手がいいでしょう。もし、毎フレームで大量のトレースを行い、トレースログが読みづらくなるようであれば、sendMetric()が役に立つでしょう。なお、sendMetric()の表示改善が検討されているので、今後のバージョンではもっと使えるようになる可能性があります。

※各カスタムメトリックに渡すメトリック名(上記コードの例だと「何か面白いことがありました!」や「他にも面白いことがありました:」)は、「.」で始まらない限り、任意のストリングを利用できます。「.」で始まるメトリック名は、Flashが内部的に使っているためです。個人的には、他のライブラリなどのメトリックと被らないように、逆DNS表記法(com.example.hogeなど)に従うことをおすすめします。

 

カスタムスパンメトリック:Telemetry.sendSpanMetric()

Scoutは、Flash Player内で行われる各アクティビティ(レンダリング、スクリプト実行など)の実行時間を計測します。カスタムスパンメトリックを使えば任意のアクティビティを指定でき、Scoutがそのアクティビティを同様に計測してくれます。任意のアクティビティは以下の手順で指定します。

  1. 処理が始まる前にTelemetry.spanMarkerを変数として保存する。
  2. 処理が終わった後にTelemetry.sendSpanMetric()にその変数を渡す。

例えば、処理時間20msがかかる2つの関数があるとしましょう。1つは通常のActionScript 3.0の処理をする関数、もう1つはレンダリングAPI(BitmapData.drawなど)を呼ぶ関数。下記のように、各関数の前後でカスタムスパンメトリックAPIを呼びます。

var marker1:Number = Telemetry.spanMarker; spendTimeOnAS3(20); Telemetry.sendSpanMetric("何かのAS3 処理中", marker1); var marker2:Number = Telemetry.spanMarker; spendTimeRendering(20); Telemetry.sendSpanMetric("何かのレンダリングAPI 処理中", marker2); var marker3:Number = Telemetry.spanMarker; spendTimeOnAS3(20); Telemetry.sendSpanMetric("何かのAS3 処理中", marker3);

こうして3つのカスタムスパンメトリックを指定し、その中の2つを同じメトリック名(「何かのAS3 処理中」)としています。このコンテンツをプロファイリングすると、以下のように各パネルで状況を確認できます。

カスタムメトリックの分析の第一歩は、[概要]パネルで「ActionScript」欄を開くことです。すると、各パネルでのカスタムスパンメトリックの情報は、緑系の色で表示されます。[概要]パネルでは、該当するフレームにおける、すべてのカスタムスパンメトリックの合計時間が表示されます。

[アクティビティシーケンス]パネルでは、カスタムスパンメトリックが実行された順に表示されます。「合計時間(ms)」欄には、カスタムスパンメトリックの実行時間(ここでは20ms)が表示されます。なお、[アクティビティシーケンス]パネルでは1フレームずつのデータを表示するので、複数フレームにおけるデータ分析を見たい場合は[上位アクティビティ]パネルや[ActionScript]パネルで確認するといいでしょう。

[上位アクティビティ]パネルでは、メトリックごとの合計時間、そしてカウント(実行された回数)を確認できます。ちなみに、図5でAS3に関する2つのカスタムスパンメトリックがまとめて表示されているのは、同じメトリック名を指定したためです。「AS3処理1」「AS3処理2」などと異なるメトリック名を指定すると別々に表示されます。

[ActionScript]パネルでは、メトリックがコールスタックの中に表示され、どの関数やイベントによって実行されたかを確認できます。

[ActionScript]パネルに表示される時間データについては注意が必要です。図5と図6は[フレーム]パネルで2つのフレームを選択した際の結果なので、それぞれのメトリックの処理時間が80msと40msになると予想されます。[上位アクティビティ]パネルでは予想に近い時間データが表示されていますが、[ActionScript]パネルでは69msと35msになっています。

[ActionScript]パネルで表示される時間データは、コールスタックの定期的なサンプリング(標本調査)によってできているため、おおよその数字になります(その理由は、すべての関数の実行時間を測定するとオーバーヘッドが重すぎてデータに影響してしまうためです)。各メトリックが実行された状況を理解するためには[ActionScript]パネルが非常に役にたちますが、正確な時間データの確認には他のパネルを使いましょう。なお、おおよその時間データを表示するのは[ActionScript]パネルのみです。

TelemetryクラスAPIのリファレンスガイドを見ると、本記事で解説したAPIの他に以下の2つがあります。

  • registerCommandHandler( commandName, handler )
  • unregisterCommandHandler( commandName )

これらは、Scoutから送信されたイベントをコンテンツ側で取得するためのAPIです。Scoutの現バージョン(1.0)では利用できませんが、今後のバージョンでの対応が検討されています。