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

4
我建立的WPF应用程序包含一个Viewport3D,其中包含各种UIElement3D对象。现在,我想将某个视图的高分辨率快照保存到文件中。我以前尝试过使用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个回答

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


1
我以前看过那篇文章,但从未成功地使其工作。你有样例或者知道获取单个Viewport3D对象内容所需的步骤吗?与此同时,我已经转向使用.NET 4.0。 - Jan van de Pol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接