Estoy escribiendo un visor de imágenes WPF, que muestra una grilla de imágenes. Estoy desconcertado por el rendimiento lento: mostrar incluso una cuadrícula de 11 x 11 hace que una máquina virtual no responda, lenta y lenta durante largos períodos de tiempo. Incluso en el poderoso host el rendimiento en no snappy.¿Cómo puedo hacer que mostrar imágenes en WPF sea más "rápido"?
El programa se basa en el diseño en SO WPF: arranging collection items in a grid: Un ItemsControl está vinculado a Items, una ObservableCollection. Cada elemento contiene un URI absoluto del sistema de archivos. DataTemplate de ItemsControl contiene un elemento de imagen cuyo origen está vinculado al URI.
Parece que el problema no puede ser el disco (SSD), la memoria (8GB VM, host de 24GB) o la CPU (i750). Además, la mayor parte del trabajo lo realiza WPF, por lo que ni siquiera puedo encontrar un problema en mi código: mi código simplemente carga los URI (es decir, las rutas a las imágenes, no a las imágenes) a la colección y vuelve rápidamente. Luego hay una espera, y WPF muestra las imágenes.
El único problema en el que podría pensar es en el procesamiento de imágenes: reducción de escala por WPF. Pero incluso en el host, que tiene una tarjeta 5850 ATI Radeon HD "suficientemente buena", el rendimiento no es rápido.
Entonces, mi pregunta es: ¿Cómo puedo hacer que mostrar imágenes en WPF sea más "ágil"?
Editar: Las imágenes son 1920x1080 HD JPEG de 22 bits capturadas desde HD m2ts de video. Intenté pre escalarlos (usando FFmpeg) a 'ega' 640x350. No fue una mejora en el rendimiento, pero las imágenes a escala reducida de FFmpeg se ven mucho peor que las de WPF.
Editar: Gracias a David Osborne el código ahora se ejecuta como x64. Aún flojo.
Editar Lo que realmente mejoró la situación es lo que Matěj Zábský denominó scalling the images: reduciendo la resolución. Para el beneficio de los lectores futuros:
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;
¿Tiene una cuadrícula estática de imágenes "conocidas"? ¿Qué tan grandes son las imágenes? –
Los futuros lectores que enfrentan este problema - vea mi respuesta aquí: http://stackoverflow.com/questions/9265725/wpf-bitmap-performance – Avi
¿Está usando sombras? –