5

私はC#の小さな2Dゲームエンジンをいじっていて、レンダリングにDirect2DとDirectWriteを使用することにしました。Windows APIコードパックとSlimDXがあることは知っていますが、インターフェイスを最初から掘り下げて記述したいと思います。Managed C ++なしで実行しようとしていますが、Direct2DとDirectWriteは従来のCOMオブジェクトを使用していないようです。それらはから派生するインターフェイスを定義しますがIUnknown、COM相互運用機能を使用してC#から実際にそれらを使用する方法はないようです。にはIIDがありますd2d1.hが、CLSIDはありません。

もちろん、私はCOM相互運用機能を初めて使用するので、何かが足りないだけかもしれません。誰かがこの状況に光を当てることができますか?

4

3 に答える 3

8

とった。オブジェクトを直接作成することはできませんが、インターフェイスを返すd2d1.dllと呼ばれるエクスポートが含まれています。これを使用すると、マネージC++なしでDirect2Dラッパーを実装できます。D2D1CreateFactoryID2DFactory

public static class Direct2D1Util {
    public const string IID_ID2D1Factory =
        "06152247-6f50-465a-9245-118bfd3b6007";

    [DllImport("d2d1.dll", PreserveSig = false)]
    [return: MarshalAs(UnmanagedType.Interface)]
    private static extern object D2D1CreateFactory(D2D1_FACTORY_TYPE factoryType,
        [MarshalAs(UnmanagedType.LPStruct)] Guid riid,
        D2D1_FACTORY_OPTIONS pFactoryOptions);

    public static ID2D1Factory CreateFactory() {
        D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS();
        object factory = D2D1CreateFactory(
            D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED,
            new Guid(IID_ID2D1Factory), opts);
        return (ID2D1Factory)factory;
    }
}

すべてのタイプがで定義されているため、すべてのタイプを含めることはしませんがd2d1.h、コードを使用してファクトリを取得する方法は次のとおりです。

ID2DFactory factory = Direct2D1Util.CreateFactory();

ID2DFactoryインターフェイスに適切なGuid属性InterfaceType(ComInterfaceType.InterfaceIsIUnknown)があることを確認してください。

于 2010-05-14T23:55:29.133 に答える
6

「Microsoft®.NETFramework用のWindows®APIコードパック」には、Direct2DおよびDirectWriteへのアクセスを可能にする管理ライブラリがあります。

http://code.msdn.microsoft.com/WindowsAPICodePack

アップデート

DirectXラッパーはマネージC++で記述されていますが、マネージライブラリを生成します。見た目では、これらはC#から使用できます。ダウンロードには、まさにこれを行う、つまりC#のマネージC++ダイレクトラッパーライブラリを使用する例がたくさん含まれているようです。

自分のC#アプリケーションでWindows 7の機能を使用すると非常に便利なので、現在Window7 SDKをインストールしています(マネージC ++ DirectXソリューションを構築できるようにするため)。

私は次の手順に従っています:

http://blogs.msdn.com/msaleh/archive/2009/08/25/introducing-directx-features-of-windows-api-code-pack.aspx

アップデート2

上記のリンクの指示に従って、マネージC ++ライブラリをコンパイルしました。実際、C#から非常に簡単に使用できます。

正しく理解できるかどうかはわかりませんが、C#からDirect2DとDirectWriteを使用する方法を検討しているだけですか、それともCOMまたはP\Invokeである必要がありますか。

不一致のテクノロジーであるため、COMラッパーがあるかどうかは非常に疑わしいです。COMは、グラフィックスプログラミングで得られるような高頻度のメソッド呼び出しパターン用に設計されているわけではありません。速度が遅すぎます。

本当にP\Invokeを実行したい場合は、常にDirectXヘッダーファイル(Windows 7 SDK内)を確認し、ツールを使用してすべてのP\Invoke呼び出しスタブを作成できます。

http://www.pinvoker.com/

この方法でラッパーを開発する場合でも、これはおそらく主要なPITAになります。

于 2010-05-14T22:55:33.487 に答える
2

Direct2Dのマネージラッパーを提供するcodeplexに関するプロジェクトがあります。それが良いかどうかはわかりませんが、おそらくソースコードがあなたが始めるのに役立つでしょう。

http://direct2dsharp.codeplex.com/

于 2010-05-14T22:34:02.390 に答える