ページ

2011年6月16日木曜日

[WP7] Mango で ListBox や ScrollViewer のパフォーマンスが向上する

Listbox – ScrollViewer performance improvement for Mango and how it impacts your existing application?
こちらの記事より。

「Outlook とかの標準アプリ(Windows Phone 7 に標準で入っているアプリ) のぬるぬるさに比べると、俺らのアプリいまいちなんだけど」 という声がそれなりにあったということでしょうか?ListBox のぬるぬるさが足りないというフィードバックが結構あったようで Mango では入力関係の入力スレッド、アニメーション関係のコンポジタースレッド、アイテム生成の UI スレッドに分けて処理することによって ListBox や ScrollViewer のパフォーマンスが向上するそうです。

ただ、そのために若干動作が異なる部分が出てくるみたい

  • ScrollViewer でスクロールしているときのプロパティの更新(UI スレッド上)
    • WP7 上の 7.0 アプリ
      プロパティが変化するとすぐさま更新
    • Mango 上(7.0 アプリと 7.1 アプリの両方)
       a. 指を離したとき
       b. 任意の方向にスクリーンの 1/4 以上ドラッグ、パン、フリックしたとき
      にプロパティが更新される
  • ScrollViewer の中でドラッグして Manipulation Delta イベントが発生するのは (UI スレッド上)
    • WP7 上の 7.0 アプリ
      ScrollViewer の中にあるエレメントによってハンドルされるこれが可能
    • Mango 上(7.0 アプリと 7.1 アプリの両方)
      入力スレッド上のイベントなので ScrollViewer によって飲み込まれる。スクロールしているときに不必要なイベントを発生しないようにするというパフォーマンス向上の一環

この非互換性が困ると言う場合は、どうやら

<ListBox ItemsSource="{Binding Items}" ScrollViewer.ManipulationMode ="Control" Height="652" Canvas.Top="80">

と言う風に ScrollViewer.ManipulationMode ="Control" を付けることができるようです。
ただし、これはまったくお勧めしない方法ということみたい。

もうちょっとましな方法は、ScrollViewer の中に横スクロールする TextBlock を組み込むとかそういう風にコードを書き換えることだそうです。
ちょっと詳しいことは読み取れてませんが、きっと縦スクロールは ScrollViewer のまかせてぬるぬるに、横スクロールはパノラマみたいにちょっとしか必要ないことが多いだろうからそっちは TextBlock とかを使って従来のスクロールにする、というような意味じゃないかと思います。横方向にたくさんのスクロールが必要な UI っていうのは普通は無いでしょうからね。

で、最後に、当然ながら ScrollViewer や ListBox を使ってない場合はなにも変わらないとあります。
たとえば、Silverlight for Windows Phone 7 Toolkit に入っている LongListSelector とかは効果なしだそうです。
えっ?と思って LongListSelector の XAML を見てみたら、これって Canvas に自前で描画してるみたいですね。誰か ScrollViewer を使う形に書きなおしてくれないかなぁ。

0 件のコメント:

コメントを投稿