2010-04-23 12 views
9

C'è un semplice MSDN example su WriteableBitmap.Wpf: Perché WriteableBitmap sta rallentando?

Mostra come disegnare una linea a mano libera con il cursore semplicemente aggiornando un pixel quando si preme il mouse e si sposta su un controllo WPF -Image.

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

Ora sto cercando di capire il seguente comportamento quando si sposta il puntatore del mouse molto veloce:

Se le dimensioni dell'immagine/bitmap è relativamente piccolo esempio 800: 600 pixel, quindi l'ultimo pixel disegnato è sempre "sincronizzato" con la posizione dei puntatori del mouse, cioè non c'è ritardo, reazione molto veloce sui movimenti del mouse.

Ma se la bitmap diventa più grande, ad es. 1300: 1050 pixel, è possibile notare un ritardo, l'ultimo pixel disegnato appare sempre un po 'in ritardo rispetto al puntatore del mouse in movimento.

Così come in entrambi i casi viene aggiornato un solo pixel con "AddDirtyRect", la velocità di reazione dovrebbe essere indipendente dalla dimensione della bitmap !? Ma sembra che Writeablebitmap diventi più lento quando le dimensioni diventano più grandi.

Oppure l'intera bitmap viene in qualche modo trasferita al dispositivo grafico su ogni chiamata writeableBitmap.Unlock(); e non solo l'area del rettangolo speziata nel metodo AddDirtyRect?

Fritz

risposta

4

C'è un errore in WriteableBitmap per WPF in Net 3.5 che causa qualsiasi chiamata a AddDirtyRect per invalidare l'intera immagine, non solo l'area rettangolare.

Si suppone che sono stati corretti in .Net 4.0

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

+0

Ma vedo che qualcuno in quel thread stava ancora sperimentando perf probs, quindi qualcuno ha veramente confermato che è stato risolto? –

+0

A partire da ora sembra che WriteableBitmap abbia ancora problemi di prestazioni. Uso AddDirtyRect come fritz per modificare solo i pixel che devono essere modificati, ma più grande è l'immagine, più lentamente diventa. Sto usando .NET 4.6, a proposito: /. –

4

In .Net 4, la bitmap scrivibile invalida ancora tutta la regione, non importa dove si aggiunge un rettangolo sporco. Puoi confermarlo usando Perforator, parte del Windows Performance Toolkit fornito con Windows SDK v7.1.

Questo è un bug di prestazioni importanti.

Problemi correlati