我已经使用c ++编写了DX11渲染器。我现在正在寻找一种实现其编辑器/ GUI的方法。
由于我非常习惯Windows窗体和WPF C#应用程序,因此我正在考虑将渲染器放入dll中,因此请从c#应用程序中加载dll并使用它绘制到窗体的定义部分中。它甚至可以与托管c#应用程序传递的窗口句柄一起使用,如果可以,性能如何?
根据我的理解,由于与DX11 API的实际通信仍将直接在c ++中进行,而c#部分只会告诉dll该做什么,因此性能损失应该几乎没有。还是这通常不是一个好主意,而使用库或D2D在c ++中直接实现GUI是更好的方法。
答案 0 :(得分:0)
在WPF中,您可以使用D3DImage,就像在xaml中的一个简单Image一样。一般原则如下:
将渲染代码放入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,则有一个严重的缺点。