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

标签 wpf directx rendertargetbitmap

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

  • 内存泄漏(至少在 .NET 3.5 SP1 中)。然而,它应该用 4.0 解决,但我还没有测试过。
  • 使用抗锯齿和像素着色器时,软件渲染无法提供与硬件渲染相同的结果。
  • RenderTargetBitmap 需要大量时间(例如 10 秒)来形成图像,而不是在屏幕上显示所需的几分之一秒。

  • 所以我想知道是否可以在新的控件/窗口(最好是屏幕外)中使用包含快照副本的 VisualBrush,然后使用 DirectX 或 GDI 技术通过前端或后端缓冲区抓取内容。我可以想象超出显卡能力的分辨率可能是一个问题,但这可以通过抓取多个子图像并将它们拼接在一起来解决。那么有人对这个话题有一些想法吗?

    请记住,我已经阅读了有关 DirectX、XNA、SlimDX、GDI+、BitBlt 等的文章,但这就是我在这些问题上的所有经验。目标平台是 Windows XP+。如果解决方案是可能的,但不是在 XP 上,我也想知道。

    此致,

    扬·范德波尔

    最佳答案

    这是一个棘手的问题,因为 WPF 将大量内部工作保留给自己,但我的一个 friend 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

    关于wpf - 将 WPF 与硬件渲染结合使用,而不是 RenderTargetBitmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437830/

    相关文章:

    visual-c++ - 是否可以在绘制时查看后台缓冲区?

    c# - DrawingContext到位图文件

    c# - DataTemplate 在 WPF 中传递不正确的命令参数

    C# - 在程序中隐藏鼠标光标

    wpf - WPF中的“Please wait” Windows

    c# - 为什么所有的坐标和大小都很奇怪?

    c# - 在 UWP 中使用 RenderTargetBitmap 时出错

    c# - 删除 WPF 中的硬编码文件夹路径

    c++ - VS 2017 找不到 DirectX 包含文件

    directx - HLSL float 组打包在常量缓冲区中?