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

时间:2010-08-09 06:40:16

标签: wpf directx rendertargetbitmap

我构建的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

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题,因为WPF保留了很多内部工作,但是我的一个朋友Jeremiah Morrill发现了一种方法来利用WPF在渲染窗口时使用的底层DirectX表面。我已经将它用于一个听起来与你的要求非常相似的项目,它的工作效果非常好(比使用WPF给你的任何“禁止”方法更快)。

你可能需要熟悉一点DirectX(不要太多,我保证!)但你可以阅读它并从他的博客下载工作源代码:

http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/438/How-to-get-access-to-WPF-s-internal-Direct3D-guts.aspx