将WPF与硬件渲染结合使用,而不是使用RenderTargetBitmap

将WPF与硬件渲染结合使用,而不是使用RenderTargetBitmap,wpf,directx,rendertargetbitmap,Wpf,Directx,Rendertargetbitmap,我构建的WPF应用程序有一个包含各种UIElement3D对象的Viewport3D。现在,我想将某个视图的高分辨率快照保存到一个文件中。我过去尝试过RenderTargetBitmap,但我不喜欢这种方法,因为它有以下缺点: 内存泄漏(至少在.NET 3.5 SP1中)。但是它应该用4.0解决,但我还没有测试过 当使用抗锯齿和像素着色器时,软件渲染不会提供与硬件渲染相同的结果 RenderTargetBitmap需要很多时间(如10秒)来形成图像,而不是在屏幕上显示所需的几分之一秒 因此,

我构建的WPF应用程序有一个包含各种UIElement3D对象的Viewport3D。现在,我想将某个视图的高分辨率快照保存到一个文件中。我过去尝试过RenderTargetBitmap,但我不喜欢这种方法,因为它有以下缺点:

  • 内存泄漏(至少在.NET 3.5 SP1中)。但是它应该用4.0解决,但我还没有测试过
  • 当使用抗锯齿和像素着色器时,软件渲染不会提供与硬件渲染相同的结果
  • RenderTargetBitmap需要很多时间(如10秒)来形成图像,而不是在屏幕上显示所需的几分之一秒
因此,我想知道是否有可能在新控件/窗口(最好是屏幕外)中使用包含快照副本的VisualBrush,然后使用DirectX或GDI技术通过前置或后置缓冲抓取内容。我可以想象,分辨率超出图形卡的能力可能是一个问题,但这可以通过抓取多个子图像并将它们缝合在一起来解决。有人对这个话题有什么想法吗

请记住,我已经阅读了有关DirectX、XNA、SlimDX、GDI+、BitBlt等的内容,但这是我在这些方面的全部经验。目标平台是Windows XP+。如果一个解决方案是可能的,但不是在XP上,我也想知道

致以最良好的祝愿


Jan van de Pol

这是一个棘手的问题,因为WPF保留了太多的内部工作,但我的一个朋友Jeremiah Morrill发现了一种方法,可以利用WPF在渲染窗口时使用的底层DirectX曲面。我曾在一个项目中使用过它,听起来它与您的需求非常相似,而且它工作得非常出色(而且比使用WPF提供的任何“禁止”的方法都要快)

您可能需要多熟悉一点DirectX(我保证不会太多!),但您可以在这里阅读并从他的博客下载可用的源代码:


我以前看过那篇文章,但从未成功地将其付诸实施。您是否有示例,或者您是否知道获取单个Viewport3D对象内容所需的步骤。与此同时,我已切换到.NET4.0