APLドキュメントの更新のパフォーマンスを最適化する


APLドキュメントの更新のパフォーマンスを最適化する

APLドキュメントのレンダリングを最適化するで説明されているように、画面付きデバイスに新しいAPLドキュメントをレンダリングする操作は、APLテンプレートの複雑さに応じた時間的コストのかかる技術的なプロセスです。このため、可能な限り、既にレンダリングされているAPLドキュメントを再利用して既存のUIを更新することが求められます。この方法を使用すると、より効率的に後続のユーザーリクエストに応答できます。

たとえば、スキルの起動時に画面にレンダリングされたAPLドキュメントで、ユーザーがボタンをタップして操作を行ったとします。または、ユーザーは画面に表示されたボタンを見て、そのラベルテキストをAlexaに話しかけることでボタンを選択します。このユーザーリクエストに応答するために選択できる方法の詳細については、APLのライフサイクルを理解するを参照してください。

音声リクエストに応答してAPLドキュメントを更新する

下の図は、画面付きデバイスで既にレンダリング済みのAPLドキュメントを更新するときに通常実行される、技術的なステップを示したものです。この図では、ユーザーリクエストが音声コマンドとして届いたときに更新が開始されます。たとえば、ユーザーがレンダリングされたAPLドキュメントを見て、「今すぐ再生」というボタンを認識したとします。ユーザーは、ボタンをタップする代わりに「アレクサ、今すぐ再生して」と言います。

以下のタイムラインは、ユーザーが音声リクエストを発し、そのリクエストをAlexaスキルが処理した後、既に画面にレンダリング済みのAPLドキュメントを更新する前に実行される技術的ステップを示しています。

音声リクエストに応答してAPLドキュメントを更新する技術的ステップ

音声リクエストに応答して、既にレンダリング済みのAPLドキュメントを更新するときに実行される技術的ステップには、次の8段階があります。

これらのすべてのステップの詳細を学ぶ前に、このプロセスがユーザーにどのように認識されるかを理解することが役立ちます。図のタイムラインと、以下のかっこ内のタイムスタンプを照らし合わせてください。

  • (t0)で、ユーザーによる対話操作が終了します。たとえば、APLドキュメントの一部であるUIボタンの読み上げやタップが終了します。
  • (t0)から(t5)までの間、デバイスでリクエストが処理中であることがユーザーに示されます。Echo Showデバイスの場合、読み込み中を表す青いバーが画面下部に表示されます。
  • (t5)で、スキルから出力音声が返されると、ユーザーはAlexaから音声応答を受け取ります。
  • (t6)で、スキルからデバイスに送信された指示に基づいて、デバイスがUIの更新を開始します。
  • (t7)で、UIの更新が完了します。例外として、画像やビデオなどのメディアアセットの読み込みは(t8)まで段階的に続くことがあります。
  • (t8)で、(t0)から開始されたリクエストへの応答として、完全に更新されたUIがユーザーに表示されます。

ステップ1: Alexaがユーザーのリクエストを処理する

画面付きデバイスが、ユーザー入力を音声コマンドとして受け取ります。たとえば、ユーザーがボタンテキストを読み上げたときに発生します。デバイスはリクエストをクラウドで処理し、Alexaスキルに転送します。このステップのレイテンシーを低減する方法の詳細については、APLドキュメントのレンダリングを最適化するのステップ1を参照してください。

ステップ2: スキルがリクエストを受け取る

Alexaスキルコードがリクエストを受け取り、いずれかのリクエストハンドラーに解決します。通常、スキルコードはAWS Lambda関数内で実行されます。詳細については、APLドキュメントのレンダリングを最適化するのステップ2を参照してください。

ステップ3: スキルが表示データを準備する

UIの更新では、ユーザーのリクエストに視覚的に応答するために、ソースから追加のデータを取得することが必要になる場合があります。動的リストデータを使用していて、ユーザーが商品項目をさらに表示するようにリクエストした場合、スキルはデータソースから商品の次のグループを読み込む必要があります。外部データソースからデータを読み込むときのパフォーマンスを最適化する方法の詳細については、APLドキュメントのレンダリングを最適化するのステップ3を参照してください。

ステップ4: スキルが更新の指示をデバイスに返す

データの読み込みと準備が完了したら、スキルコードは次のいずれかのアクションを実行して、デバイスに応答する必要があります。

  • ExecuteCommandディレクティブを構築して返す - APLコマンドを実行して、既に画面にレンダリング済みのAPLドキュメントを変更する場合に行います。たとえば、SetValueコマンドを使用して動的なAPLコンポーネントプロパティを変更し、フォントの色や表示状態などの外観を変更します。または、PlayMediaコマンドを使用して、既に画面にレンダリング済みのAPLドキュメントに含まれているAPL Videoコンポーネントでビデオの再生を開始します。
  • UpdateIndexListディレクティブを構築して返す - 動的リストデータソースの項目を追加、変更、削除する場合に行います。テンプレートのデータソースから動的リストデータを変更すると、APL GridSequenceなどの複数子コンポーネントのデータプロパティがそのデータに関連付けられていれば、更新されたリストデータが自動的にコンポーネントに表示されます。
  • 空または通常のスキル応答を返す - スキルでは、ユーザーからの音声リクエストへの応答として必ずしもUIを更新する必要はありません。代わりに、出力音声で応答してリクエストを受け付けたり、更新を音声で提供したりできます。

次の方針に従うと、このプロセスステップのパフォーマンスを改善できます。

  • 複雑なAPLコマンド構造を複製しない - このような構造は、画面にレンダリング済みのAPLドキュメントに既に含まれています。ユーザーによる音声リクエストがボタンの押下などのUIアクションを表している場合、コマンドの複製が発生する可能性があります。たとえば、ユーザーが「アレクサ、送信ボタンを押して」と言ったとします。 一貫したユーザーエクスペリエンスを提供するには、スキルで「送信」ボタンのUI動作を再現する必要があります。そのためにスキルは、ボタンを表すAPL TouchWrapperコンポーネントのonPressイベントハンドラーで実行されるコマンドと同様の一連のAPLコマンドを返します。このときにコマンドの複製を避けるには、APLテンプレートでAPLのユーザー定義コマンドを利用して、テンプレート内で特定のユーザーイベントを処理するために使用されるコマンドロジックをカプセル化します。これにより、該当するコマンドをスキルでも再利用できるようになります。スキルコードは、一連のAPLコマンドの複製を返す代わりに、単一のユーザー定義コマンドを実行するExecuteCommandディレクティブを返すことができます。この方法で、テンプレート内でユーザーイベントの処理に使用されるものと同じユーザー定義コマンドを実行します。
  • 応答サイズを制限内に収める - APLコマンドの数やリスト項目の更新回数を適度なレベルに保ち、スキル応答に適用されるバイトサイズ制限を超えないようにします。

ステップ5: APLテンプレートがAlexaで処理され、デバイスに送信される

スキル応答がAlexaクラウドに返されて検証され、処理された後、スキルユーザーの画面付きデバイスに送信されます。詳細については、APLドキュメントのレンダリングを最適化するを参照してください。

ステップ6: Alexaが音声で読み上げる、またはオーディオを再生する

デバイスが、スキルから返された出力音声またはオーディオ応答を再生します。

  • ディレクティブの実行順序に注意してください。返された出力音声と一部のAPLディレクティブは、デバイスのAPLランタイムによって順番に処理されます。ただし、ExecuteCommandディレクティブやUpdateIndexListディレクティブは、Alexaが読み上げを終了した後にのみ実行されます。この結果、望ましくないユーザーエクスペリエンスが生じることがあります。その場合は、スキル応答の出力音声を短縮または削除するか、APL SpeakItemコマンドを使用して読み上げ音声などのオーディオを再生するようにして、問題を軽減するしかありません。

スキルから出力音声やオーディオ応答が返されない場合、このステップは省略され、ステップ7がすぐに処理されます。

ステップ7: スキルから返されたディレクティブが実行される

APLランタイムが、レンダリング済みのドキュメントのUIを更新するスキルリクエストを処理します。つまり、ExecuteCommandディレクティブで指定されたAPLコマンドが実行されるか、UpdateIndexListディレクティブの指示に従って動的リストデータソースが更新されます。

ステップ8: 埋め込みメディアファイルが読み込まれる

UIの更新によって新しい画像が表示される場合や、新しいビデオまたはオーディオの再生が開始される場合は、CDNプロバイダーなどのコンテンツソースからメディアファイルを段階的に取得するプロセスが続行されます。APLテンプレートでのメディアの読み込みを最適化してレイテンシーを低減する方法の詳細については、APLドキュメントのレンダリングを最適化するのステップ10を参照してください。

UIイベントに応答してAPLドキュメントを更新する

音声リクエストとは異なり、UIイベントは、Alexaクラウドインターフェースを介して受け取るのではなく、デバイスのAPLテンプレート内でキャプチャされます。現時点では、スキルへのクラウドラウンドトリップは完全にオプションであり、暗黙的に発生することはありません。これがパフォーマンスの大幅な向上につながる可能性があります。

下の図は、APLテンプレートでキャプチャされたユーザー操作に応答して、既にレンダリング済みのAPLドキュメントを更新するときに通常実行される技術的なステップを示したものです。たとえば、ユーザーがレンダリングされたAPLドキュメントを見て、「今すぐ再生」というボタンを認識したとします。ユーザーはそのボタンをタップします。

以下のタイムラインは、デバイスでUIイベントがキャプチャされ、APLテンプレートがリクエストを処理した後、画面上で更新が行われる前に実行される技術的ステップを示しています。

UIイベントに応答してAPLドキュメントを更新する技術的ステップ

上の図と、以下のかっこ内のタイムスタンプを照らし合わせてください。

  • (t0)で、ユーザーによる対話操作が終了します。たとえば、ユーザーがUIボタンを押して離します。このイベントはAPLテンプレートのイベントハンドラーの1つによってキャプチャされるため、すぐに処理が開始されます。通常はAPLコマンドを使用してアクションをトリガーします。たとえば、背景色などの視覚プロパティを変更します。
  • (t1)で、APLコマンドが実行され、それに応じて視覚的なUIが変更されます。UIの変更によって新しい画像が表示される場合や、ビデオまたはオーディオが再生される場合は、段階的な読み込みのプロセスが続行されます。
  • (t2)で、画像などのすべてのメディアファイルの読み込みが完了し、デバイスにレンダリングされます。

この時点でUIの更新は終了します。クラウドへのラウンドトリップがなければ、ネットワークレイテンシーやクラウド処理時間が追加されることはありません。可能な限りこのアプローチを使用してください。この方法では更新がほぼ即座にユーザーに表示されるため、最もパフォーマンスに優れています。ただし、スキルへのクラウドラウンドトリップを開始せざるを得ない状況もあります。たとえば、データベースから新しいデータを取得して画面に表示する必要がある場合や、デバイス上でローカルに発生するUI操作をスキルのバックエンドで追跡する場合です。次のアクションではいずれも、クラウドラウンドトリップが開始される可能性があります。

  • 最も一般的なシナリオとして、このプロセスのステップ1で実行されるAPLコマンドにはAPL SendEventコマンドが含まれていることがよくあります。SendEventコマンドは、UserEventを作成してスキルに送信します。
  • 動的リストデータソースを使用していて、そのデータがスクロール可能なリストビューに関連付けられている場合、ユーザーがリストビューの末尾付近にスクロールすると、APLランタイムはLoadIndexListDataリクエストを作成してスキルに送信します。• 同様に、動的リストデータソースがAPL Pagerなどのページ単位の項目ビューにバインドされている場合、ユーザーが画面に表示されている最後の項目のページに近づくと、ランタイムはLoadTokenListDataリクエストを作成してスキルに送信します。

クラウドラウンドトリップで発生する処理や、レイテンシーが増加する原因、このプロセスを最適化してパフォーマンスを高める方法の詳細については、音声リクエストに応答してAPLドキュメントを更新するを参照してください。


このページは役に立ちましたか?

最終更新日: 2025 年 11 月 26 日