2010-04-23 44 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性能工具包的一部分。

這是一個主要的性能錯誤。