WPF + Direct2D のサンプル(サーフェイスの共有)

WPF も Direct2D もハードウェア アクセラレーションが重要な機能の一つです。しかし、WPF が使うのは Direct9(Ex) サーフェイスで、Direct2D が使うのは DXGI 1.1 サーフェイスです。例えば Direct2D の描画を WPF で表示しようとするとき、ハードウェア サーフェイスが共有できないため、一旦システムメモリーに読み戻さなければならず、パフォーマンスが低下します。Direct2D をソフトウェア レンダリングで使ったほうが良い性能が得られるかもしれません。

この問題を解決するにはサーフェイスを共有できるようにしなければなりません。サーフェイスを共有する方法については、Surface Sharing Between Windows Graphics APIs で詳しく解説されています。また、以下のようなサンプルコードが公開されています。

Ee913554.surface_sharing_interoperability(en-us,VS.85).png

上記の共有手法を使って、Direct2D の描画を WPF で表示するサンプルを Rob Relyea が彼のブログで公開しました。

image

D3DImage を継承する D2DD3DImage クラスを作成し、XAMLで以下のように表示しています。

<Image Stretch="Fill" Name="ImageHost">
    <Image.Source>
        <local:D2DD3DImage x:Name="InteropImage"/>
    </Image.Source>
</Image>