Wpf: Почему WriteableBitmap работает медленнее? - PullRequest
9 голосов
/ 23 апреля 2010

Существует простой пример MSDN о WriteableBitmap.

Показывает, как нарисовать линию курсора от руки, просто обновив один пиксель, когда мышь нажата и перемещается над элементом управления изображением WPF.

 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 ]

4 голосов
/ 08 августа 2010

В .Net 4 растровое изображение с возможностью записи по-прежнему делает недействительным весь регион независимо от того, где вы добавили грязный прямоугольник. Вы можете подтвердить это с помощью Perforator, части Windows Performance Toolkit, поставляемого с Windows SDK v7.1.

Это серьезная ошибка производительности.

4 голосов
/ 27 июля 2010

В WriteableBitmap для WPF в .Net 3.5 есть ошибка, из-за которой любой вызов AddDirtyRect делает недействительным все изображение, а не только прямоугольную область.

Это должно быть исправлено в .Net 4.0

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

...