在C#WPF或Windows Forms应用程序中使用DirectX c ++ DLL

时间:2019-02-19 13:44:04

标签: c# c++ directx direct3d11

我已经使用c ++编写了DX11渲染器。我现在正在寻找一种实现其编辑器/ GUI的方法。

由于我非常习惯Windows窗体和WPF C#应用程序,因此我正在考虑将渲染器放入dll中,因此请从c#应用程序中加载dll并使用它绘制到窗体的定义部分中。它甚至可以与托管c#应用程序传递的窗口句柄一起使用,如果可以,性能如何?

根据我的理解,由于与DX11 API的实际通信仍将直接在c ++中进行,而c#部分只会告诉dll该做什么,因此性能损失应该几乎没有。还是这通常不是一个好主意,而使用库或D2D在c ++中直接实现GUI是更好的方法。

1 个答案:

答案 0 :(得分:0)

在WPF中,您可以使用D3DImage,就像在xaml中的一个简单Image一样。一般原则如下:

  • 分配Direct3D 9纹理,这将是您的渲染目标。
  • 将其移交给D3DImage.SetBackBuffer。
  • 将渲染代码放入CompositionTarget.Rendering事件处理程序中。

        RenderStuffToTexture();
        d3dImage.Lock();
        d3dImage.AddDirtyRect(new Int32Rect()
        {
            X = 0,
            Y = 0,
            Height = d3dImage.PixelHeight,
            Width = d3dImage.PixelWidth
        });
        d3dImage.Unlock();
    

由于使用的是Direct3D 11,因此必须使用DXGI surface sharing与D3D11共享D3D9文本。我知道有两个例子可以说明如何做到这一点。微软D3D11Image和D3DImageEx(我个人的喜好,可以在线找到多个地方)。

关于性能,一旦您使用WPF,就不再需要自己进行演示了。您实际上是在基于WPF D3D9的渲染器中编写了一个小的纹理渲染逻辑。因此,包括演讲时间在内的所有内容都无法控制。根据我的个人经验,您可以以不错的帧率最终定义简单的场景。对于真正的图形密集型应用程序和严格的FPS要求,我将使用更轻便(且侵入性较小)的UI解决方案。

请注意,您还可以使用WinformHost控件获取HWND并将其呈现。如果您想将UI控件叠加在渲染的框架上-这是您无法做到的-AFAIK,则有一个严重的缺点。