アプリケーションのパフォーマンスのトラブルシューティング

Kanzi は、アプリケーションのパフォーマンスを測定するためのさまざまな手段を提供し、さまざまなパフォーマンスパラメータを表示します。これらの手段とパラメータを使用して、アプリケーションのパフォーマンスを向上させてください。

Kanzi Studio でのアプリケーションパフォーマンスの表示

../../_images/select-performance-hud.png

Kanzi Studio でアプリケーションのパフォーマンスと内部構造を分析するには、Preview で 解析オフ をクリックして Analyze モードに入り、アナライズオン を右クリックし、次を選択します:

  • Performance HUD は、Kanzi アプリケーションの過去500フレームにおける全体的なパフォーマンス指標を示します。

    • Frame Duration (ms) は、最後のフレームをレンダリングするのにかかった時間をミリ秒単位で表示し、平均、最高、および最低の時間を示します。

      Frame Duration (ms) グラフの上部の値は最長時間を示し、下部の値は最後の500フレーム中にフレームをレンダリングするのにかかった平均時間を示しています。

      この情報を使用して、Kanzi アプリケーションのパフォーマンスボトルネックを特定します。たとえば、レンダリングを複数のフレームに分散させることで、アプリケーションのパフォーマンスを向上させる方法を見つけることができます。レンダリングを複数のフレームに分散する を参照してください。

      ../../_images/frame-duration-graph.png
    • Frames Per Second は、1秒あたりにレンダリングされるフレーム数を示します。

    • Animation Duration (μs) は、アプリケーション内のすべてのアニメーションを最後のフレームで実行するのにかかる時間をマイクロ秒単位で示し、平均、最高、最低の時間も表示します。

    • Batch Count は、個々のドローコールが何回実行されたかを示します(glDrawElements と glDrawArrays)。

      Kanzi Engine APIを使用して Renderer::getBatchCount を呼び出すことで、バッチ数にアクセスできます。

      Batch Count グラフの上部の値は、直近の500フレームでのバッチの最大数を示し、下部の値は最後のフレームでのバッチの数を示します。

      ../../_images/batch-count-graph.png
    • Triangle Count は、フレーム中に合計で描画された個々の三角形の数を示します。

      Kanzi Engine APIで Renderer::getTriangleCount を呼び出すことにより、三角形の数にアクセスできます。

    • Texture Switches は、新しいテクスチャがGPUにバインドされた回数を示します。

      Kanzi Engine APIで Renderer::getTextureSwitchCount を呼び出すことにより、テクスチャスイッチのカウントにアクセスできます。

    • FBO Switches は、GPUにバインドされたフレームバッファオブジェクトの数を示します。レンダリングのベストプラクティス を参照してください。

      Kanzi Engine APIで Renderer::getFramebufferSwitchCount を呼び出すことにより、バッファスイッチカウントにアクセスできます。

    • Shader は、新しく適用されたバッチに対して新しいシェーダーがバインドされた回数と、最後のフレームに送信された個々のシェーダーユニフォームの数を示します。シェーダースイッチの削減 を参照してください。

      Kanzi Engine APIで Renderer::getShaderSwitchCount を呼び出すことにより、シェーダースイッチのカウントにアクセスできます。

      Kanzi Engine APIで送信されたユニフォームには、Renderer::getUniformSendCount を呼び出すことでアクセスできます。

    • Buffer Switches は、GPUにバインドされた頂点、インデックス、およびユニフォームバッファオブジェクトの数を示します。

      Kanzi Engine APIで Renderer::getBufferSwitchCount を呼び出すことにより、バッファスイッチカウントにアクセスできます。

    • Buffer and Texture Data Updates は、新しい頂点バッファまたはテクスチャデータがGPUにアップロードされた回数を示します。同じバッファが書き込みおよび読み取り操作にアクセスされる場合、これらの重い操作はGPUの実行に遅延を引き起こす可能性があります。理想的な値は0です。

      例えば、この値はテキストグリフキャッシュが頻繁に更新される必要がある場合に増加することがあります。この場合、グリフキャッシュの更新を減らすために、Text Block ノードの Font Size プロパティの値を減らしてください。

      Kanzi Engine APIで Renderer::getHeavyweightCallCount を呼び出すことで、これにアクセスできます。

    • View Camera は、アプリケーション内でシーンを表示するために使用される Camera ノードの名前を示します。

    • Resource Memory Use は、Kanzi アプリケーションが使用するローカルGPUメモリ(VRAM)と非ローカルGPUメモリ(RAM)の推定量を表示します。

      Performance HUD が Kanzi Studio Preview に表示する値と、ターゲットデバイスで Kanzi アプリケーションを実行したときに表示される値が異なるのは、Kanzi Studio がアプリケーション内のすべてのリソースをロードしてメモリに保持するためです。

    • Timers は MainLoopScheduler に登録されているタイマーハンドラーの数を示します。タイマーハンドラーが多すぎると、アプリケーションのパフォーマンスが低下する可能性があります。タイマーの追加 を参照してください。

      Kanzi Engine APIで MainLoopScheduler::getTimersCount を呼び出すことにより、タイマーサブスクリプションの数にアクセスできます。

    • Recurring Tasks は、メインループスケジューラーのステージに追加されたタスクの総数を示します。Kanzi Engine はデフォルトでいくつかのタスクを追加します。反復タスクの追加 を参照してください。

      Kanzi Engine APIで MainLoopScheduler::getTasksTotalCount を呼び出すことにより、反復タスクの数にアクセスできます。

    • Animations は、Kanzi アプリケーション内のアクティブなアニメーションとすべてのアニメーションの数を表示します。

      Kanzi Engine APIでアニメーションの数にアクセスできます。

  • Framebuffer objects は、テクスチャにレンダリングされ、フレームバッファオブジェクトの切り替えを引き起こすノードを半透明の黄色の動くストライプでマークします。

  • Transparency は透明なノードを半透明の青い動くストライプでマークします。効率的なレンダリングのためのノードの設定 を参照してください。

  • Overdraw のビジュアライゼーションは、Kanzi が同じピクセルに複数回レンダリングされる領域を示します。より明るい緑色は、オーバードローの量が多いことを示しています。

Sorting Filter でオーバードローを防ぐ を参照してください。

全体的なパフォーマンスの表示

Kanzi アプリケーションの全体的なパフォーマンスを確認するには:

  • Kanzi Studio Preview で、解析オフ をクリックし、コンテキストメニューで Performance HUD を有効にします。

  • application.cfg で、完全な Performance HUD の表示を有効にします。

    PerformanceInfoLevel = 2
    

    PerformanceInfoLevel を参照してください。

  • Performance HUD の表示をアプリケーションコードで有効にし、Application::onConfigure 関数で使用します。

    configuration.performanceInfoLevel = ApplicationProperties::PerformanceInfoLevelFull;
    

    PerformanceInfoLevel を参照してください。

  • application.hpp で、Performance HUD の表示を有効にするには、Application::getPerformanceInfoLevel および Application::setPerformanceInfoLevel 関数を呼び出します。

    ApplicationProperties::PerformanceInfoLevel getPerformanceInfoLevel() const
    {
        return m_applicationProperties.performanceInfoLevel;
    }
    void setPerformanceInfoLevel(ApplicationProperties::PerformanceInfoLevel level)
    {
        m_applicationProperties.performanceInfoLevel = level;
    }
    
  • フレームレートの値をログファイルに書き込むには、application.hpp で Application::getFramesPerSecond 関数を呼び出して、Kanzi Engine から現在のフレームレート値を取得できます。Kanzi Engine は、Application::getEngine を呼び出してアプリケーションから取得できます。

  • フレームをレンダリングするのにかかる時間を取得するには、MainLoopScheduler タイミングインターフェース MainLoopScheduler::getLastFrameDuration を使用します。

アプリケーション構成リファレンス を参照してください。

リソースのロード時間を表示する

application.cfg ファイルまたは Application::onConfigure 関数内のアプリケーションコードで、Kanzi を設定して、アプリケーションが使用するリソース kzb ファイルの読み込みにかかる時間をデバッグコンソールに出力することができます。リソースの読み込みとデプロイ時間の測定 を参照してください。

グラフィックスパフォーマンスの表示

application.cfg ファイルまたは Application::onConfigure 関数内のアプリケーションコードで、Kanzi を設定してデバッグコンソールに出力することができます。

  • アプリケーション起動時のグラフィックス関連情報 (GL レンダラー、バージョン、シェーディング言語のバージョンなど)。LogOpenGLInformation を参照してください。

  • アプリケーション起動時のグラフィックス関連拡張機能のリスト。LogOpenGLExtensions を参照してください。

  • アプリケーション起動時のグラフィックス関連プロパティ (スワップ動作、ディスプレイサイズ、アプリケーションのウィンドウサイズなど) のリスト。LogSurfaceInformation を参照してください。

  • アプリケーションのグラフィックスAPI呼び出しのログ。GraphicsLoggingEnabled を参照してください。

ノードのオーバードローの表示

Overdraw のビジュアライゼーションは、Kanzi が同じピクセルに複数回レンダリングされる領域を示します。より明るい緑色は、オーバードローの量が多いことを示しています。

Kanzi は、ステンシルバッファを使用して、同じピクセルに何回描画するかを計算します。ステンシルバッファを使用してコンテンツをレンダリングしている場合、Overdraw のビジュアライゼーションは予期しない結果を返すことがあります。

オーバードローのビジュアライゼーションは表示されません:

  • 3Dノードをコンポジションにレンダリングし、その後テクスチャにレンダリングする場合のオーバードロー。この場合、Overdraw のビジュアライゼーションは、テクスチャにレンダリングされたコンポジションのコンテンツを単一のクアッドとして表示します。

  • ノードの一部は、先祖ノードで Clip Children プロパティを有効に設定したときにクリップされます。

  • 完全に透明なノードや、子孫ノードを含む表示されていないノード。

アプリケーションでオーバードローを表示するには、Kanzi Studio Preview で image0 をクリックして Analyze モードに入り、image1 を右クリックし、Overdraw を選択します。

../../_images/overdraw-enabled.png

テクスチャにレンダリングされるノードの表示

フレームバッファオブジェクトの切り替えは、一部のプラットフォームでパフォーマンスの大幅な低下を引き起こす可能性があります。Kanzi がノードをテクスチャにレンダリングする条件は複雑になることがあります。例えば、回転、スケール、または不透明度が原因でテクスチャへのレンダリングが発生することがあります。

ノードがテクスチャにレンダリングされ、フレームバッファオブジェクトの切り替えを引き起こしているかどうかを確認するには、Preview で analyze-off-1 をクリックして Analyze モードに入り、analyze-on-1 を右クリックして Framebuffer objects を選択します。Preview は、透明なオレンジ色のストライプでテクスチャにレンダリングされているレイヤーをハイライトします。

コンポジションレンダーターゲットにレンダリングされるノードの表示

Kanzi Studio では、アプリケーション内のどの2Dノードが Kanzi によってコンポジションレンダーターゲットにレンダリングされるかを確認できます。

Preview でアルファブレンディングを使用する2Dノードを表示するには、Preview で プレビュー分析オフ をクリックして Analyze モードに入り、プレビュー分析オン を右クリックして Transparency を選択します。

Preview は、Kanzi が半透明の青いストライプで合成レンダーターゲットにレンダリングするノードを強調表示します。

関連項目

リソースの読み込みとデプロイ時間の測定

アプリケーション構成リファレンス

シェーダースイッチの削減

効率的なレンダリングのためのノードの設定

レンダリングのベストプラクティス

アニメーションのベストプラクティス

ロギング

無効なプロジェクトアイテムを見つける