2012-02-13 13 views
8

Estoy tratando de entender por qué mis imágenes no son ágiles, así que construí una muestra para probar el rendimiento de WPF. Usé un temporizador para calcular cuánto tiempo se ejecutó mi controlador de eventos "mostrar imágenes" y usé un cronómetro para medir cuánto tiempo tardaron las imágenes en aparecer en la pantalla. La conclusión: cuando se muestran 100, 1600, 2500 y 3600 imágenes, WPF tomó 2, 9, 12 y 16 segundos después de mi código había terminado para mostrar las imágenes en la pantalla. Así que me siento impotente: parece que no puedo mejorar mi código para hacer que las imágenes aparezcan más rápido. ¡Tengo que hacer algo con WPF!WPF Funcionamiento del mapa de bits

Así que mi pregunta es: ¿Qué debo hacer de manera diferente para que las imágenes se visualicen más rápido?


La configuración de la prueba es simple:

La ventana contiene una cuadrícula. Después de hacer clic en el botón de "prueba", fila y columna son las definiciones added.Then se agrega una imagen a cada celda de la cuadrícula de la siguiente manera:

  var image = new Image(); 
      image.BeginInit(); 
      image.Name = ImageNameFromCell(theRow, theColumn); 
      image.Stretch = Stretch.None; 
      image.HorizontalAlignment = HorizontalAlignment.Center; 
      image.VerticalAlignment = VerticalAlignment.Center; 
      RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); 
      image.EndInit(); 

      theGrid.Children.Add(image); 

Por último, la Fuente de cada imagen se ajusta en un mapa de bits: una imagen en escala de grises ya reducida al tamaño de pantalla estimado. El mapa de bits se genera de la siguiente manera:

  var smallerBitmapImage = new BitmapImage(); 
      smallerBitmapImage.BeginInit(); 
      smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth); 
      smallerBitmapImage.UriSource = theUri; 
      smallerBitmapImage.CacheOption = BitmapCacheOption.None; 
      smallerBitmapImage.EndInit(); 

      //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath); 

      var convertedBitmap = new FormatConvertedBitmap(); 
      convertedBitmap.BeginInit(); 
      convertedBitmap.Source = smallerBitmapImage; 
      convertedBitmap.DestinationFormat = PixelFormats.Gray16; 
      convertedBitmap.EndInit(); 
      convertedBitmap.Freeze(); 

Por lo tanto, estoy en mi ingenio. Las imágenes aparecen con un retraso notable, y parece estar fuera de mi control. ¿Que puedo hacer?

Respuesta

3

Lo que parece haber hecho la diferencia está fijando opción de caché de la imagen para onLoad

smallerBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

Esto movió el trabajo a mi controlador de eventos, por lo que ahora puedo usar la precarga para hacer esto en el fondo.

3

¿De verdad ves todas esas imágenes al mismo tiempo? De lo contrario, puede usar ItemsControl con un panel de virtualización para que solo se muestren las imágenes a la vista. (Hablando de paneles, su configuración actual también podría ser sustituida por una ItemsControl el cual utiliza un UniformGrid como panel)

También podría tratar de escribir una mejor decodificador, lo que probablemente es un esfuerzo inútil.

+0

Gracias por su respuesta, H.B. Sí, deseo ver todas esas imágenes al mismo tiempo. Los casos 1600, 2500 y 3600 fueron para las pruebas, por lo que podía medir el retraso de WPF fácilmente con la aguja de segundos de un reloj, pero diría que 400 imágenes es un número que me gustaría apoyar. y volver a la sugerencia "mejor decodificador", pensé decodificación ya se hizo en el código "smallerBitmapImage" anterior, es decir, en mi código y no durante el tiempo de WPF hace lo que hace después de mis declaraciones de control de eventos, que es el tiempo que estoy tratando de acortar ... – Avi

+1

@Avi: Ah, claro, que los archivos son locales, presumiblemente, la decodificación puede suceder de forma sincrónica, pero no estoy seguro sobre el funcionamiento interno; dado que la conversión no arroja excepciones, esa suposición parece viable. Si esto se reduce a tiempo de presentación pura que realmente podría estar en un aprieto como ya parecen hacer todo lo que podría acelerar el proceso de decodificación de un tamaño más pequeño para la prevención de la escala. No sé qué más podrías hacer aquí :( –

Cuestiones relacionadas