我使用 C++ 编写了一个 DX11 渲染器。我现在正在寻找一种为其实现编辑器/GUI 的方法。
由于我非常习惯 Windows 窗体和 WPF C# 应用程序,我正在考虑将我的渲染器放入 dll 中,从 c# 应用程序加载 dll 并使用它绘制到窗体的定义部分。这甚至可以与托管 C# 应用程序传递的窗口句柄一起使用吗?如果可以,性能如何?
根据我的理解,由于与 DX11 API 的实际通信仍然直接在 C++ 中进行,而 C# 部分只会告诉 dll 做什么,因此性能损失应该几乎没有。或者这通常是个坏主意,使用库或 D2D 直接在 C++ 中实现 GUI 是更好的方法。
最佳答案
在 WPF 中,您可以使用 D3DImage这就像您的 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 surface sharing与 D3D11 共享 D3D9 文本。我知道有两个例子可以说明如何做到这一点。微软D3D11Image和D3DImageEx(个人喜好,网上多处可以找到)。
关于性能,一旦您使用 WPF,您就不再需要自己进行演示。您实际上是在基于 WPF D3D9 的渲染器中编写一个小的渲染到纹理逻辑。因此,并非一切都可以控制,包括演示时间。根据我的个人经验,您绝对可以以不错的帧率渲染简单的场景。对于真正的图形密集型应用程序和严格的 FPS 要求,我会使用更轻量级(且侵入性更小)的 UI 解决方案。
请注意,您还可以使用 WinformHost 控件获取 HWND 并呈现给它。如果您想将 UI 控件覆盖在渲染的帧上,这将有一个严重的缺点 - 据我所知,您根本做不到。
关于c# - 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54767732/