ページ

2009年8月6日木曜日

[Silverlight] GPU アクセラレーションの RenderAtScale

さっきの記事 「[Silverlight] Re: Smooth:ハードウェア・アクセラレーターの動作確認」 をポストしたあとに RenderAtScale なんていうすばらしいものがあることに気付きました。

さっきの記事でも参考にさせてもらった András Velvárt さんの 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 の後半の “Render At Scale” より。

ざっと訳してみます。
「Silverlight はベクタベースのグラフィックだけど、ビットマップキャッシングはビットマップベース。ビットマップとベクタグラフィックの主な違いは、ベクタグラフィックは品質を落とさずにほとんど無限に拡大できるってところ。一方、ビットマップは大きく拡大するとカクカクになっちゃう。こういったとき、GPU はバイリニアフィルタリングを適用してくれる。[訳注: ジャギーを減らすためにアンチエイリアスしてくれるってことですね]

カクカクがイヤな場合、BitmapCache の RenderAtScale をセットすることができる。

(コードで書く場合)
var bmc = new BitmapCache();
bmc.RenderAtScale = 4;
lion1.CacheMode = bmc;
(XAML で書く場合)
<Canvas>
    <Canvas.CacheMode>
        <BitmapCache RenderAtScale="4" />
    </Canvas.CacheMode>
</Canvas>

上のコードは Silverlight にライオンのベクタを 4倍のサイズでレンダリングするように指示している。ただし、これは 16倍の GPU メモリを要求することになり、キャッシュされたビットマップをレンダリングするのも遅くなる。RenderAtScale の効果は、サンプルの “GPU Acceleration” チェックボックスをオンにしておいて、”High Res Bitmap” をオンにすれば見ることができるよ。」

どうでしょ?
効果のほどはサンプルを見ると一目瞭然だと思います。
András Velvárt さんの 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 の下の方にデモへのリンクがあります。
最初は GPU アクセラレーションを使っていない状態。
これだと、ベクタグラフィックなので拡大されてもライオンちゃんはスムースです。

”GPU Acceleration” をオンにすれば GPU アクセラレーションが有効になった状態になります。
この状態だと、ライオンちゃんが拡大されているときはジャギジャギになります。
これは XAML に書かれたサイズのまま GPU によってビットマップキャッシュされて、それが拡大縮小表示されているためです。

ここで “High res bitmap” をオン。
すると拡大されているライオンちゃんもスムースになります。
同時にフレームレートのところに表示されている 2番目の GPU メモリの消費量が増えているはずです。
これが RenderAtScale=”4” の状態です。
すなわち、XAML に書かれたサイズの 4倍 (面積で 16倍) の大きさでビットマップキャッシュされて、それが拡大縮小表示されているわけです。

GPU アクセラレーションを使い、拡大表示も行うときは、RenderAtScale は重要なパラメータになりそうですね。


0 件のコメント:

コメントを投稿