2010年12月20日

Windows Phone 7のパフォーマンス対策

 こんばんわ、今日はシーラカンスの日だったり、自分にとって今の会社の最後の出社日だったりと色々記念になりそうな日です。

 そして、C# Advent Calendar jp: 2010の20日目のエントリとしてWindows Phone 7開発でパフォーマンス対策として行ったことをいくつか紹介しようと思います。

 (.NET系ネタということだから、あんまりC#っぽくなくてもいいよね)

以外と頑張るエミュレーター



 スマートフォン開発ではエミュレーターの遅さが何かと話題になりますが、Windows Phone 7のエミュレーターは意外とパフォーマンスが良いです(最初の起動に時間がかかるのはご愛嬌)。
 なので、エミュレーターでは問題なく動いていた動作が実機に転送してみるともたつくという事態に遭遇することなります。

 Windows Phone 7開発者としては、一度実機で動かして動作を見るというのが大事になりそうです。

ListBoxは重い?



 重いというより描画しきれなくて何も表示しない時間が発生する感じ。
 画像などを利用したリストの場合は画像のせいで重くなることがある。

 この場合Windows Phone 7のListBoxのパフォーマンスを上げる 〜その1〜で紹介されているようにStackPanelを利用するとスムーズに描画できる場合がある。

 画像を多数表示するような場合はLowProfileImageLoaderを利用することでもたつきを軽減することができる。


プログラム処理が邪魔している?



 プログラムの重い処理がUIスレッドを固めるケースもエミュレータより実機の方が多い。
 こういう場合はプログラムをバックグラウンドで動かすことでUIのフリーズを回避することができる。

 ピボットやパノラマの遷移時に処理が重くなるケースはこれに該当することが多い。

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += _doSomething; // バックグラウンドで行う処理
bw.RunWorkerAsync();


_doSomethingの処理の中でUIスレッドを操作(ListBoxに値をつっこむなど)をしたい場合は

Dispatcher.BeginInvoke(delegate()
{
  // UIを操作する処理
});


Dispatcher.BeginInvokeするのは基本かな。


分離ストレージはほどほどに



 DB感覚でリストに変更があるたびに分離ストレージに変更したデータを保存したり取り出したりしているとデータ量が上がるとだんだんパフォーマンスが落ちてくる(そりゃそうだ・・・)。

 やはりオンメモリ(プログラム上の変数など)でデータを扱い、分離ストレージにはアプリの終了時などに退避して、再起動時に取り出すようにして扱うと処理は早くなる。


 基本といえば基本な気もしますが、モバイル開発という環境に慣れていない自分としては、限られたリソースの中での制限は新鮮でした。

 それでは楽しいWindows Phone 7開発ライフを!!

coelacanth_blog at  twitterでつぶやく  23:59WindowsPhone | Silverlight この記事をクリップ!
Profile
Recent Comments
QRコード
QRコード
livedoor Readerに登録
RSS
livedoor Blog(ブログ)