我用c++编写了一个DX11渲染器。我现在正在寻找一种方法来实现它的编辑器/GUI。
由于我非常习惯 Windows 窗体和 WPF C# 应用程序,因此我正在考虑将渲染器放入 dll 中,从 C# 应用程序加载 dll,并使用它绘制到表单的定义部分。这是否适用于托管 C# 应用程序传递的窗口句柄?如果适用,性能如何?
根据我的理解,由于与 DX11 API 的实际通信仍然直接在 c++ 中进行,而 c# 部分只会告诉 dll 做什么,因此性能损失应该几乎没有。或者这通常是一个坏主意,使用库或 D2D 直接在 C++ 中实现 GUI 是更好的方法。
在WPF中你可以使用D3DImage https://learn.microsoft.com/en-us/dotnet/api/system.windows.interop.d3dimage?view=netframework-4.7.2这就像 xaml 中的简单图像一样。总体原理如下:
- 分配 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 表面共享 https://learn.microsoft.com/en-us/windows/desktop/direct3darticles/surface-sharing-between-windows-graphics-apis与 D3D11 共享 D3D9 纹理。我知道有两个例子可以说明如何做到这一点。微软D3D11图像 https://github.com/Microsoft/WPFDXInterop和D3DImageEx(我个人的喜好,可以在网上多个地方找到)。
关于性能,一旦使用 WPF,您就不再需要自己进行演示了。您实际上是在基于 WPF D3D9 的渲染器中编写了一个小的渲染到纹理逻辑。所以并不是所有事情都可以控制,包括演示时间。根据我的个人经验,您绝对可以以良好的帧速率渲染简单的场景。对于真正的图形密集型应用程序和严格的 FPS 要求,我会使用更轻量级(且侵入性较小)的 UI 解决方案。
请注意,您还可以使用 WinformHost 控件来获取 HWND 并呈现给它。如果您想在渲染帧上覆盖 UI 控件,这会带来严重的缺点 - 据我所知,您根本做不到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)