Wpf:为什么WriteableBitmap会变慢?

时间:2010-04-23 19:37:38

标签: wpf writeablebitmap

关于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方法中指定的矩形区域?

弗里茨

2 个答案:

答案 0 :(得分:4)

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

它应该已经在.Net 4.0中修复了

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

答案 1 :(得分:4)

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

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