【问题标题】:DirectX, bouncing a directx rendering from a source hwnd to a new target hwndDirectX,将 Directx 渲染从源 hwnd 反弹到新的目标 hwnd
【发布时间】:2015-03-13 00:20:21
【问题描述】:

我有一个相当具有挑战性的课题,我正在努力解决。

在 WPF/WinForms 中,我可以创建一个具有重大限制的 WebBrowser 组件,如果我可以将 DirectX 表面从 Web 浏览器控件反弹到我已设置的 DirectX 表面,这些将大大解决/减少。

需要注意的几点:

  1. WebBrowser 组件在现有内容上方的“浮动”窗口中托管 IWebBrowser2 OLE/ActiveX 组件,作为 WPF 窗口的子窗口。

  2. 我知道并且可以(无需破解)浮动窗口的 HWND;以及运行实际 Internet Explorer 组件的子级 HWND。

  3. 我可以确认窗口正在使用 directX 进行渲染,但我没有任何句柄来处理 HWND 之外的任何内容。我不知道它渲染到的表面、设备或其他任何东西。

我发现的潜在解决方案:

  1. BitBlt 子窗口到 WPF 表面来解决问题;这是最后的选择,因为它需要一个计时器来捕获和更新位图。这似乎很浪费,而且似乎不是那么好。

  2. “重定向”HWND 的 directx 表面的选项已被 Microsoft 博客作者指出为“微不足道”,但他们从未真正解释过如何。因此,如果有人知道的话,可能会有一种更高级的 non-directx 非 gdi 方法。

  3. 使用交换链将 directx 表面从源 WebBrowser HWND 反弹到新目标。这是我的最佳选择;但它甚至很难开始,因为除了目标的 HWND 之外我没有任何其他东西。 (我不限于 WPF,其他技术如 OLE/COM/MFC/ATL/WinForms 解决方案都很棒!)

  4. 有没有一种方法可以从 OLE/COM 对象访问 directx 设备?... 有点高兴,使用反射/调试器我似乎找不到任何对它的引用。但这也有点 hack-y,因为我正在深入研究实现的内部。

是否有任何人可以提供关于我如何以最少的“黑客行为”和最大的性能最好地完成此任务的任何指针、提示或方向?

【问题讨论】:

    标签: wpf directx webbrowser-control ole iwebbrowser2


    【解决方案1】:

    首先,我真的不认为您可以强制 WebBrowser 直接呈现到您的自定义 DirectDraw 表面上。但是,您也许可以提供 DD 表面的 HDC 以供绘制。

    如果你想玩这个,WebBrowser ActiveX 控件实现Windowless ActiveX Controls interfaces。理论上,您可以实现一个无窗口的 ActiveX 主机并使用IViewObject::Draw 绘制到 DD 表面的 HDC。我无法预测它的性能,但我怀疑它甚至会接近 Trident 渲染引擎的原生 DirectDraw 性能。

    我还发布了一个使用OleDraw(间接调用IViewObject::Draw)的somewhat related code

    【讨论】:

    • 感谢您的帮助。我无法深入研究 OleDraw/IViewObject::Draw 解决方案,但您确实给了我一个相当有趣的想法。 BitBlt/StretchBlt 在使用相同的呈现和使用 DirectX DC 时都是硬件加速的。稍微戳了一下,我认为使用 GDI 的 BitBlt 想法会更快,但使用 DirectX 表面,它工作得很好!您可以在此处查看结果:gist.github.com/trevorlinton/293f8d3de742ed7054e4 最终似乎没有不需要使用计时器的解决方案:/。
    • @Trevor,关于计时器,您可以尝试使用主机实现的IAdviseSink。控件应该在其表示更改时调用。
    • 我尝试过使用 IAdviseSink,但是在创建和销毁控件时它似乎只发布了一条通知。我想我可以深入研究更多其他 MSHTML 界面,看看这里是否有一些可以节省的地方。
    • 没关系,OLE 对象有 IViewObjectPresentNotify 接口可以知道何时将要进行渲染。 msdn.microsoft.com/en-us/library/gg593035(v=vs.85).aspx
    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多