none
ListBox で全てのアイテムが表示されたタイミングを取得する方法は? RRS feed

  • 質問

  • 現在、ListBox に3万件のデータを表示した際のパフォーマンスをテストしています。
    ListBox の ItemsSource にデータがセットされた後、
    セットされたデータを反映させた全ての ListBoxItem が表示されたタイミングを
    取得するにはどうすればよいでしょうか?
    2007年7月26日 1:16

回答

  •  tngar さんからの引用
    はい。
    全アイテムがロードされたタイミングは取得できましたが、
    これはレンダリングが終了したタイミングではないですよね?

     

    WPF はビジュアルツリーの変更を検知してレンダリングエンジンがバックグラウンドで非同期描画を行うので,そういった用途であれば専用のプロファイラを使った方が良いかもしれません.有名どころは WPFPerf あたりでしょうか.

     

    また,Direct3D のアーキテクチャ上,CPU が描画データを Direct3D に流し終えた後にもドライバレベルでのキューイングが存在し,最大で数 10 msec 程度の遅延が発生します.この遅延を見ようと思ったら,NVidia などが提供している専用のプロファイラ (NVPerfHUD) を用いたり,Microsoft 提供のプロファイラである PIX for Windows を用いる (こちらでのタイミング解析は Windows Vista 専用です) といったことが必要になります.

    さらに Windows Vista では,DWM よって画面描画が一元管理されることで,画面内容の更新はいわゆる vsync 割り込みのタイミングに整列されるため,さらに話はややこしくなります.(この整列自体,さらに Direct3D ドライバによってキューイングされている可能性もあります)

     

    他にもリモートデスクトップ使用時は,描画の一部がリモート PC で分散処理されるなど,描画タイミングの定義は難しいです.

     

    あとは,PresentationSource クラスを直接使う ( たとえば ContentRendered イベントをモニタする) ことで,ある程度の情報は得られるかもしれません.

     

    ただ,Direct3D アプリケーションのタイミング解析は,いったんフルスピードでターゲットアプリケーションを走らせながら,Event Tracing for Windows などでタイミング情報を保存していき,後で専用の解析ツールを使ってタイミング解析を行う方法が主流です.

    2007年7月27日 7:23

すべての返信


  • 内容の繰り返し表示に,
    デフォルトで VirtualizingStackPanel を使っているので
    そもそも見えている近辺までしかロードしないんじゃないでしょうか?

    2007年7月26日 8:39
  • はい。
    仰る通りですね。説明不足でした。

    実際にテストしてるのは ItemsPanel を Canvas や WrapPanel に変更した場合ですが(無茶は承知の上です。。)、
    VirtualizingStackPanel でも見えている部分の表示(レンダリング)が終了したタイミングが取れるのであれば問題ありません。

    試しに全ての ListBoxItem に Loaded ハンドラを設定して、アイテム数をカウントして
    (Virtualizing ではないときです)、
    全アイテムがロードされたタイミングは取得できましたが、
    これはレンダリングが終了したタイミングではないですよね?
    2007年7月27日 3:38
  •  tngar さんからの引用
    はい。
    全アイテムがロードされたタイミングは取得できましたが、
    これはレンダリングが終了したタイミングではないですよね?

     

    WPF はビジュアルツリーの変更を検知してレンダリングエンジンがバックグラウンドで非同期描画を行うので,そういった用途であれば専用のプロファイラを使った方が良いかもしれません.有名どころは WPFPerf あたりでしょうか.

     

    また,Direct3D のアーキテクチャ上,CPU が描画データを Direct3D に流し終えた後にもドライバレベルでのキューイングが存在し,最大で数 10 msec 程度の遅延が発生します.この遅延を見ようと思ったら,NVidia などが提供している専用のプロファイラ (NVPerfHUD) を用いたり,Microsoft 提供のプロファイラである PIX for Windows を用いる (こちらでのタイミング解析は Windows Vista 専用です) といったことが必要になります.

    さらに Windows Vista では,DWM よって画面描画が一元管理されることで,画面内容の更新はいわゆる vsync 割り込みのタイミングに整列されるため,さらに話はややこしくなります.(この整列自体,さらに Direct3D ドライバによってキューイングされている可能性もあります)

     

    他にもリモートデスクトップ使用時は,描画の一部がリモート PC で分散処理されるなど,描画タイミングの定義は難しいです.

     

    あとは,PresentationSource クラスを直接使う ( たとえば ContentRendered イベントをモニタする) ことで,ある程度の情報は得られるかもしれません.

     

    ただ,Direct3D アプリケーションのタイミング解析は,いったんフルスピードでターゲットアプリケーションを走らせながら,Event Tracing for Windows などでタイミング情報を保存していき,後で専用の解析ツールを使ってタイミング解析を行う方法が主流です.

    2007年7月27日 7:23
  • ありがとうございました。
    厳密な測定が必要になったときに参考にさせていただきます。


    今回はタイミング以前に重すぎるので(当たり前ですが)、
    やはり VirtualizingPanel からカスタムパネルを作るのが現実的ですね。
    2007年7月27日 10:23