Sto scrivendo un visualizzatore di immagini WPF, visualizzando una griglia di immagini. Sono sconcertato a causa delle prestazioni lente: la visualizzazione anche di una griglia 11 x 11 rende una VM poco reattiva, lenta e fiacca per lunghi periodi di tempo. Anche sul potente host le prestazioni in non-snappy.Come posso rendere più "scattante" la visualizzazione delle immagini su WPF?
Il programma si basa sul progetto in SO WPF: arranging collection items in a grid: Un oggetto ItemsControl è associato a Items, ObservableCollection. Ogni oggetto contiene un URI assoluto di file system. DataTemplate di ItemsControl contiene un elemento Image la cui origine è associata all'URI.
Sembra che il problema non possa essere il disco (SSD), la memoria (8 GB VM, 24 GB host) o CPU (i750). Inoltre, la maggior parte del lavoro è fatto da WPF, quindi non è nemmeno come se potessi individuare un problema nel mio codice: il mio codice carica semplicemente gli URI (cioè i percorsi delle immagini, non le immagini) per la raccolta e restituisce rapidamente. Poi c'è un'attesa e WPF mostra le immagini.
L'unico problema a cui potrei pensare è l'elaborazione delle immagini - riduzione graduale di WPF. Ma anche sull'host, che dispone di una scheda ATI Radeon HD "abbastanza buona" 5850, le prestazioni non sono ottimali.
Quindi, la mia domanda è: Come posso rendere più "scattante" la visualizzazione delle immagini su WPF?
Modifica: Le immagini sono JPEG HD a 22 bit a 1920x1080 acquisite da video HD m2ts. Ho provato a ridimensionarli (usando FFmpeg) in 'ega' 640x350. Lì era un miglioramento delle prestazioni ma le immagini ridotte di FFmpeg sembrano molto peggio di quelle di WPF.
Modifica: Grazie a David Osborne il codice ora funziona come x64. Ancora lento.
Modifica Ciò che ha migliorato la situazione è ciò che Matěj Zábský ha chiamato facendo scattare le immagini: riducendo la risoluzione. A beneficio dei futuri lettori:
fullPath = new Uri(path, UriKind.Absolute);
BitmapImage smallerBitmapImage = new BitmapImage();
smallerBitmapImage.BeginInit();
smallerBitmapImage.DecodePixelWidth = (int) (theWidthOfTheGrid/theNumberOfColumns);
smallerBitmapImage.UriSource = fullPath;
smallerBitmapImage.EndInit();
FormatConvertedBitmap formatConvertedBitmap = new FormatConvertedBitmap();
formatConvertedBitmap.BeginInit();
formatConvertedBitmap.Source = smallerBitmapImage;
formatConvertedBitmap.DestinationFormat = PixelFormats.Gray16;
formatConvertedBitmap.EndInit();
formatConvertedBitmap.Freeze();
this.ImageSource = formatConvertedBitmap;
Quindi hai una griglia statica di immagini "conosciute"? Quanto sono grandi le immagini? –
I futuri lettori che affrontano questo problema - vedi la mia risposta qui: http://stackoverflow.com/questions/9265725/wpf-bitmap-performance – Avi
Stai usando le ombre? –