ページ

2009年8月7日金曜日

[Silverlight] WriteableBitmap のパフォーマンス

Silverlight 3 WriteableBitmap Performance Follow-Up より。
Silverlight 3 の WriteableBitmap のパフォーマンスが比較されています。
WriteableBitmap っていうのは、結局のところビットマップをバイト配列としてごにょごにょするわけですが、同じようなことができるようになっているクラスライブラリがいくつか公開されています。
それらのパフォーマンス比較です。
比較されているのは、

  1. Silverlight 3 の WriteableBitmap。
  2. オープンソースのゲームエンジン Balder の RawPngBufferStream クラス。
  3. Nikola さんの PngEncoder (Joe Stegman さんの改造バージョン)。
  4. Ian Griffiths さんの SlDynamicBitmap ライブラリ。
  5. Quakelight で使われている 8 ビット BitmapData。
  6. Silverlight 3 のピクセルセルシェーダー。

です。

記事に比較した結果も載ってますが、比較するための Silverlight アプリも貼りつけてありますので、実際に実行して自分の環境でどういう結果になるか試してみることもできます。
ちなみに、ソースもあります。

で、結果です。
1~5 では WriteableBitmap がもっとも速いそうです。
まぁ、ランタイムに組み込まれてるんですから当然という気はしますね。
5 の Quakelight は WriteableBitmap に近い速度が出るそうですが、これは 256色カラーのみに限定しているのでそもそも扱ってるデータ量が違いますからね。
そして、特筆すべきは 6 のピクセルシェーダーです。WriteableBitmap の 10倍の速度が出ています。
ピクセルシェーダーと言うと、既存の画像を加工するものというイメージがありましたが、今回のように計算によって描画できるものであればピクセルシェーダーだけで絵を描いてしまうこともできるわけですね。

記事にはこうあります。
「ピクセルシェーダーは GPU で実行されているわけではないけれども、他のものと比較するとかなり速い。プロシージャルな画像 (計算によって描ける画像) ならばピクセルシェーダーを使うのがお勧め。ただし、Silverlight 3 では制限付きのシェーダーモデル 2 がサポートされているのみということは忘れないように。あと、Silverlight 3 のピクセルシェーダーはマルチコア CPU だと自動的に並列実行されることに気付いた。デュアルコアのマシンだとシングルコアのマシンの 2倍くらいのフレームレートが出ていた。Silverlight でのソフトウエアシェーダーの実装が並列化されているのはまったく正しいし、特別なことではない。シェーダーは GPU 上では並列に実行されるようにデザインされている。」

Silverlight 3 のピクセルシェーダーは GPU で動いているわけではないっていう話だったのになぜ速いんだろうと不思議だったんですが、この自動的に並列化されているっていうのがミソなのかな?
もともとシェーダーランゲージは GPU の中で並列実行されるのが前提ですし。
もしかしたら、WriteableBitmap へのアクセスをうまく並列化してやればピクセルシェーダーを超えるパフォーマンスを出せるかもしれませんね。


0 件のコメント:

コメントを投稿