2013/01/03

RenderTargetBitmap の罠

大晦日に作ったフィルタで複雑な XAML ファイルを読み込んでみたら、10 ~ 15 FPS しか出てなかった。調べてみたら RenderTargetBitmap の Render メソッドで 50 msec くらいかかってた。

よく考えてみれば RenderTargetBitmap はメインメモリ上にあるので、ソフトウェアで XAML が描画されてるということになる。ハードウェアで描画するためには、ビデオメモリ上のレンダーターゲットに書き込んでもらわねばならないからだ。

ハードウェア上のレンダーターゲットからメインメモリに画像データを転送する機能は WPF には実装されておらず、されたとしてもストールが発生して非常にコストのかかる処理になってしまうので非現実的っぽい。(非同期で転送すればいいのかもだけど。)

改善策としては、現在の WPF レンダラの実装だと1 コアしか描画に使ってないので、描画するパーツを分けてそれぞれ独立に描画させるとか。面倒なのでやらないけど。

そもそもがテロップ用に作ったものなので、そんなに複雑なものは表示させないという。

おまけ

image

このフィルタを作ろうと思ったきっかけとなったソフト。

GDI+ で OpenType のサポートがないという驚愕の事実を知って、「サポートしてる WPF にレンダリングさせれば楽じゃん。しかもベクターグラフィックスに対応している上にアニメーションもできるぜ!」という感じで思いついた。

ところで、GDI+ の後釜(?)の Direct2D では OpenType がサポートされてるらしいので、それ使えば OpenType も病ができるらしい。というかそもそもなんで GDI+ でサポートされてないんだ……。リンゴ対策の陰謀か……。

0 件のコメント:

コメントを投稿