8

我有一个 WPF 应用程序,用于在实时流中覆盖 HUD。最初的想法是为 xsplit(一种用于呈现实时流的流行应用程序)创建一个插件来显示 WPF 应用程序的内容。这种方法的问题是,将位图渲染到 xsplit 的 COM 接口对释放应用程序的 CPU 性能有很大的损害(因为我相信 xsplit 的 COM 接口以及使用 RenderTargetBitmap 会对 CPU 造成负担)。

我一直在研究将叠加层直接渲染到游戏中(目标 DirectX 应用程序),因为它提供了许多好处。主要是它规避了 xsplit 中的性能问题,而且还向各种流和捕获应用程序开放了应用程序。


我对 DirectX 不是很有经验,但我认为这是解决方案的大纲

  1. 初始化 WPF 应用程序并捕获 WPF 的 Direct3d 设备(通过此方法)

  2. 查找并挂钩目标 DirectX 应用程序的 EndScene 调用(使用 EasyHook+Slimdx)

  3. 将 WPF 设备表面的内容渲染到挂钩的 DirectX 应用程序之上


我的主要问题是如何使用 SlimDX 完成第 3 步。我希望解决方案能够以某种方式重用表面而不依赖于复制,因为目标是不影响挂钩应用程序的性能。我还希望能够限制该地区并支持透明度。我还想知道在挂钩的 DirectX 应用程序的设备中使用 WPF 的 Direct3d 设备是否会导致任何不稳定。

任何见解将不胜感激,谢谢。

4

1 回答 1

1

我正在尝试做同样的事情。到目前为止,我发现您可以将 wpfvisualtree 渲染为位图,然后将位图写入第 2 点中捕获的 d3d 设备。

void render(Direct3D.Device device)
{

wpfRenderTargetBitmap.Render(WpfVisualTree);
wpfRenderTargetBitmap.CopyPixels(devicePtr);

}

我还没有对此进行测试,但我认为我在正确的轨道上。我现在唯一的问题是我失去了窗口中的所有交互性。按钮点击等将不再被捕获......

任何帮助都会很好。

于 2012-06-21T09:07:44.993 回答