ページ

2009年4月3日金曜日

[Silverlight] Silverlight 3 のハードウエア・アクセラレーションについて

Silverlight 3 の新機能、GPU によるハードウエア・アクセラレーションについてです。

Silverlight 3 Quick Tip #4: Hardware Acceleration
Bitmap Caching in Silverlight 3

まず、デフォルトではハードウエア・アクセラレーションは無効になっています。
<object> タグを使っている場合は

<param name="EnableGPUAcceleration" value="true" />

のように EnableGPUAcceleration を指定してやる必要があります。
ASP.NET サーバサイドコントロールの場合は <asp:Silverlight EnableGPUAcceleration=”true” ... />、Silverlight.js の場合は忘れましたが create するところで EnableGPUAcceleration を true にしてやります。

ただし、これだけでハードウエア・アクセラレーションが働くわけではありません。
ハードウエア・アクセラレーションを有効にしてやりたい XAML エレメントに CacheMode=”BitmapCache” を付けてやる必要があります。

<StackPanel CacheMode="BitmapCache"/>

とかっていう感じです。
CacheMode に指定できるのは今のところ BitmapCache のみのようです。
CacheMode が指定された要素、および、その子供たちがハードウエア・アクセラレーションの対象となります。

そもそも、ハードウエア・アクセラレーションが使えるのは

  • Windows: ブラウザ、および、フルスクリーン (DirectX 9.0c 以上が入っている必要あり)
  • Mac: フルスクリーンのときのみ (Safari のフラグイン・モデルの制限から来るらしい)

とのことです。

ただ、すべての処理がアクセラレートされるということはもちろん無く、(少なくとも今の beta では)

  • Transform 族(TranslateTransform、ScaleTransform、RotateTransform など)
  • 矩形クリッピング
  • ブレンディング

の処理でのみハードウエア・アクセラレーションが使われるそうです。
なので、こういった処理をほとんどしていないようなアプリケーションではハードウエア・アクセラレーションは何の効果もありません。
それどころか 「CacheMode を指定する要素はよくよく考えて決める必要がある」 と書かれています。
レンダリングシステムがキャッシュを使うべきかどうかを判断するオーバーヘッドがそれなりにある、また、レンダリングメカニズムはハードウエア・アクセラレーションする要素を描画するごとにアンマネージの中間サーフェスを使って処理するけれどもこれが実際には使われなかったらかなり高価なものにつく、といった感じで説明されています。
だから 「最上位の要素に CacheMode を指定する」 なんてことはしちゃダメで、ハードウエア・アクセラレーションが必要な最も葉側 (leaf-most) の要素にだけ CacheMode を指定すること、とのことです。
どうやら、ヘタに CacheMode を指定するとかえってパフォーマンスを落とすことになりかねないようですね。

あと、確認用の機能として

<param name="EnableCacheVisualization" value="true" />

というのがあります。
これを指定しておくとハードウエア・アクセラレーションが有効になっている要素は普通に、なっていない要素は赤く表示されます。


    0 件のコメント:

    コメントを投稿