2010-04-23 94 views
9

关于WriteableBitmap有一个简单的MSDN exampleWpf:为什么WriteableBitmap变慢?

它显示了如何通过在按下鼠标并且正在移动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方法中指定的矩形区域?

弗里茨

回答

4

有一个在WriteableBitmap的WPF为.NET 3.5中,导致以AddDirtyRect任何调用整个图像,而不仅仅是矩形区域无效的错误。

它应该被固定在.NET 4.0中

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

+0

但是我看到那个线程中的某个人仍在使用perf probs,所以有人真正确认它是固定的吗? – 2011-02-01 20:42:13

+0

截至目前看来,WriteableBitmap仍然存在性能问题。我使用像fritz这样的AddDirtyRect来只改变需要改变的像素,但是图像越大,它越慢。顺便说一下,我正在使用.NET 4.6:/。 – 2016-03-08 15:13:20

4

在.NET 4中,可写的位图仍然是整个区域无效无论你在哪里添加一个脏矩形。您可以使用Perforator进行确认,Perforator是Windows SDK v7.1附带的Windows性能工具包的一部分。

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