【问题标题】:WPF fast method to draw image in UIWPF在UI中绘制图像的快速方法
【发布时间】:2013-04-23 04:41:33
【问题描述】:

我有一个项目需要执行快速图像渲染。

目前,我使用禁用拉伸的图像控制。通过设置 Source 属性由计时器进行更新。

WriteableBitmap frame = Player.Get().GetFrame();
if (frame != null)
     image.Source = frame;

这部分成为性能瓶颈。更清楚 image.Source = frame 是一个瓶颈。

我查看了 MediaElement,但它不适用。

有什么方法可以更快地执行它吗?

也许像 GDI BitBlt 或类似的一些方法?

提前致谢。

【问题讨论】:

  • 瓶颈是Player.Get().GetFrame(),还是image.Source = frame
  • 瓶颈真的在 image.Source = frame.它在 WinForms 中运行很快,但是当我移植到 WPF 时,性能大大下降。
  • 也许writeablebitmapex.codeplex.com 项目有一些技巧?
  • 如果你保留一个WriteableBitmap,并在每一帧设置它的像素,会有什么不同吗?
  • 目前是这样实现的。它使用单个 WriteableBitmap,并且 Source = frame 用于重绘 Image 元素。我没有找到另一种重绘图像元素的方法。

标签: wpf image


【解决方案1】:

您不会从 WPF 中获得太多性能。即使是 MediaElement 也无法正确处理高清视频,没有闪烁和滞后。

使用 WindowsFormsHost 标签在您的 WPF 应用程序中托管一个 WinForms 元素,如果您想使用 GDI,则在那里执行 blitting。虽然 GDI 主要是基于软件的,但您可能需要查看 DirectX 或 GDI+。

【讨论】:

  • 谢谢。我正在考虑使用 DirectX,但没有找到有关 WPF 和 DX 互操作的有用信息。
  • 有没有什么方法可以使用wpf控件作为DX面?
  • 据我所知,没有。 WPF 已经是您可能知道的 DirectX,但它不允许您直接访问底层 DirectX 对象。有一些方法可以通过核心反射来访问它,但我不建议这样做。在我看来,WPF 无论如何都是“帧受限的”。您也可以使用 D3DImage 类(msdn.microsoft.com/en-us/library/cc656785.aspx)托管 DirectX,但这又太慢了,因为它取决于 WPF 系统。只需在 WindowsFormsHost 中托管一个 WinForms 面板,然后您就可以访问 WInForms 面板 HWND,您可以将其传递给 DirectX。
  • 感谢您的回答。是的,我知道,WPF 是基于 DX 的。我没有找到一种方法来访问它的底层 DX 对象,并提出了这个问题,希望有人知道如何访问它。我尝试了 WinFormsHost(感谢您的建议) - 它不适用,因为它会阻止驻留在图像元素上的其他 WPF 控件。
  • D3DImage 不能解决这个问题。它允许将 D3D 图形渲染为图像。但是,它并没有解决图像绘制性能问题。
【解决方案2】:

如果你真的需要性能,最好的办法可能是为 bitblt 编写一个小包装器。

也许这两篇文章对你有帮助:

BitBlt Dot Net Style

Using BitBlt to copy and paste graphics

【讨论】:

  • 这个方法不错。但是,我正在寻找一种将 DirectX 与 WPF 结合使用的方法。获取 WPF UI 元素的表面。
  • @АндрейМосквичёв 请详细说明您的目标是什么。
  • 我正在制作视频播放器应用程序。进行解码、缩放等。现在我需要一种快速的方法来在 UI 中绘制框架。设置 Image.Source 是一种低性能方法。我正在寻找一种直接访问 WPF UI 元素内容的方法(如果可能的话)。或者某种方法,它会尽可能快地起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多