【问题标题】:Wpf: Why is WriteableBitmap getting slower?Wpf:为什么 WriteableBitmap 变慢了?
【发布时间】:2010-04-23 19:37:38
【问题描述】:

有一个关于 WriteableBitmap 的简单MSDN example

它展示了如何通过在鼠标按下并在 WPF -Image Control 上移动时仅更新一个像素来使用光标绘制一条手绘线。

 writeableBitmap.Lock();  
 (...set the writeableBitmap.BackBuffers pixel value...)
 writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1));
 writeableBitmap.Unlock();

现在我试图理解快速移动鼠标指针时的以下行为:

如果图像/位图尺寸相对较小,例如800:600 像素,那么最后绘制的像素总是与鼠标指针位置“同步”,即没有延迟,对鼠标移动的反应非常快。

但是如果位图变大,例如1300:1050 像素,你可以注意到延迟,最后绘制的像素总是在鼠标移动后出现一点延迟。

所以在这两种情况下,只有一个像素被“AddDirtyRect”更新,反应速度应该与位图大小无关!?但似乎 Writeablebitmap 变大时会变慢。

或者整个位图是否会在每次writeableBitmap.Unlock(); 调用时以某种方式传输到图形设备,而不仅仅是AddDirtyRect 方法中指定的矩形区域?

弗里茨

【问题讨论】:

    标签: wpf writeablebitmap


    【解决方案1】:

    .Net 3.5 中 WPF 的 WriteableBitmap 存在一个错误,该错误会导致对 AddDirtyRect 的任何调用都使整个图像无效,而不仅仅是矩形区域。

    它应该已在 .Net 4.0 中修复

    http://social.msdn.microsoft.com/Forums/en-US/wpfprerelease/thread/1b84e451-9698-431f-9c51-078825a729b5

    【讨论】:

    • 但我看到该线程中的某个人仍然遇到性能问题,所以有人真正确认它已修复吗?
    • 目前看来 WriteableBitmap 仍然存在性能问题。我使用像 fritz 这样的 AddDirtyRect 来仅更改需要更改的像素,但是图像越大,速度越慢。顺便说一下,我正在使用 .NET 4.6:/.
    【解决方案2】:

    在 .Net 4 中,无论您在何处添加脏矩形,可写位图仍然会使整个区域无效。您可以使用 Perforator 来确认这一点,它是 Windows SDK v7.1 附带的 Windows 性能工具包的一部分。

    这是一个主要的性能错误。

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      相关资源
      最近更新 更多