WPF + Direct2D のサンプル(サーフェイスの共有)
WPF も Direct2D もハードウェア アクセラレーションが重要な機能の一つです。しかし、WPF が使うのは Direct9(Ex) サーフェイスで、Direct2D が使うのは DXGI 1.1 サーフェイスです。例えば Direct2D の描画を WPF で表示しようとするとき、ハードウェア サーフェイスが共有できないため、一旦システムメモリーに読み戻さなければならず、パフォーマンスが低下します。Direct2D をソフトウェア レンダリングで使ったほうが良い性能が得られるかもしれません。
この問題を解決するにはサーフェイスを共有できるようにしなければなりません。サーフェイスを共有する方法については、Surface Sharing Between Windows Graphics APIs で詳しく解説されています。また、以下のようなサンプルコードが公開されています。
- DXGI 1.1 Synchonized Shared Surface Sample
- Direct3D9Ex and DXGI SHared Surface Queue
- Direct2D SDK Sample: DXGI Interop
上記の共有手法を使って、Direct2D の描画を WPF で表示するサンプルを Rob Relyea が彼のブログで公開しました。
D3DImage を継承する D2DD3DImage クラスを作成し、XAMLで以下のように表示しています。
<Image Stretch="Fill" Name="ImageHost">
<Image.Source>
<local:D2DD3DImage x:Name="InteropImage"/>
</Image.Source>
</Image>