2009-07-29 15 views
7

Actualmente estoy trabajando en una aplicación que permite al usuario jugar (desplazarse automáticamente) a través de una serie de imágenes locales. Por lo general, habrá cinco o seis en la pantalla a la vez.Acelerar la carga de una imagen desde el disco en una aplicación Windows Forms (C# .net)

El principal cuello de botella en este momento parece ser la carga real de los datos de imagen del disco. Un hilo del temporizador requiere que las imágenes se actualicen cada 1/6 de segundo y la aplicación tiene problemas para mantenerse al ritmo de esa velocidad. Cada imagen tiene alrededor de 25 Kb.

Intenté crear una memoria caché rodante para probar y cargar las imágenes, pero esto también se quedó atrapado consigo mismo, por lo que terminé desacelerándose tanto.

Cada latido del temporizador, estoy bucle a través de los seis marcadores de imagen cargar la siguiente imagen con el estándar método

Image img = Image.FromFile("filename"); 

pero pensó que alguien pudiera conocer de una manera más rápida para obtener las imágenes de disco.

Hay entre 500 y 20,000 imágenes en cada uno de los seis juegos, por lo que es demasiado grande para cargar todo en la memoria al inicio.

Si alguien tiene sugerencias para una forma más rápida de pasar estas imágenes, sería muy apreciado.


Edite para agregar más detalles sobre el flujo de la aplicación.

Vale, esto es lo que está pasando: botón de 'play' éxitos

usuario. El hilo del temporizador comienza con un tiempo de espera de 1/6 segundos.

temporizador de devolución de llamada:

Update image index (_index++) 
for each viewer in list of visible viewers (the forms to display images) 
{ 
    get the filename from the id stored in the viewer 
    check to see if the file exists 
    if it does exist, 
     create new bitmap from image 
     and return that image 
    otherwise return null 

    if returned image isn't null, display it on screen 
} 

Eso es, obviamente, va a través de unas pocas capas - la carga de imágenes que ocurre en la capa de servicios y luego pasa esto a través de la presentación y luego a la interfaz de usuario, sino que es la esencia de lo que está sucediendo .

Respuesta

8

Me encontré con this page que describe cómo usar la API GDI + directamente para cargar imágenes. Muy fácil de usar:

ImageFast.FromFile(@"C:\MyPhoto.JPG"); 

añadido para mostrar la velocidad de ImageFast sobre imagen De Archivo método

Se utiliza el código fuente encontró here.El código fue copiado y pegado y no requirió cambios.

Stopwatch watch = Stopwatch.StartNew(); 

string filePath = @"C:\TestImage25k.png"; 

Image fromFile = Image.FromFile(filePath); 

watch.Stop(); 

Console.WriteLine("Image.FromFile  Ticks = {0:n}", watch.ElapsedTicks); 

long fromFileTicks = watch.ElapsedTicks; 

watch.Reset(); 
watch.Start(); 

Image fastImage = ImageFast.FromFile(filePath); 

watch.Stop(); 

long fastFileTicks = watch.ElapsedTicks; 

Console.WriteLine("ImageFast.FromFile Ticks = {0:n}", watch.ElapsedTicks); 

Console.WriteLine("fromFileTicks - fastFileTicks = {0:n}", fromFileTicks - fastFileTicks); 

La salida de la consola fue

 
Image.FromFile  Ticks = 19,281,605.00 

ImageFast.FromFile Ticks = 7,557,403.00 

fromFileTicks - fastFileTicks = 11,724,202.00 

se puede ver el impacto de la ImageFast. Con el tiempo, esos 11 millones de tics guardados se sumarán.

+1

Escribí una aplicación de prueba rápida para probar esto, y el ImageFast es más rápido en 11 millones de tics. El archivo from the Image toma 19 millones mientras que el ImageFast solo toma 7 millones. –

+0

Gracias por los resultados de las pruebas, David :) – bernhof

+0

No hay problema. Me gustan los resultados de ImageFast. –

1

Lo más fácil podría ser colocar un botón 'siguiente' y 'anterior' para limitar el número de imágenes y la precarga.

0

Si tiene 6 imágenes visualizadas a la vez, y las cambia cada 1/6 de segundo, debería encontrarse con problemas de rendimiento. Cargar 150 kb del disco debería ser una actividad trivial incluso sin almacenamiento en caché. Parece que puede estar exagerando las cargas de archivos. ¿Estás seguro de que solo estás cargando 6 imágenes a la vez? ¿Estás leyendo imágenes del disco que no se muestran?

Si puede proporcionar un poco más de detalle del flujo de aplicaciones, es posible que pueda ser un poco más útil.

+0

Hola, He editado la pregunta para mostrar un poco de la corriente de aplicación. Definitivamente solo está cargando las 6 imágenes a la vez. Si empiezo a cerrar algunas de las ventanas del "visor", se está acelerando notablemente. También intenté leer las primeras 50 imágenes de cada conjunto en la memoria antes de jugar y eso elimina por completo el cuello de botella, por lo que parece ser solo la carga lo que hace que las cosas vayan más despacio. –

0

i probablemente crear un subproceso de fondo a buscar continuamente todas las imágenes desde el disco (mantiene la interfaz de usuario de respuesta) y luego publicar cada imagen recién cargada a través de un evento

1

Salida del concepto de double buffering. Lo que desea hacer es tener un segundo hilo que pueda cargar el siguiente conjunto de imágenes mientras que está visualizando el primer conjunto. Una vez que llega la puerta de tiempo de 1/6, cambia el conjunto de imágenes y comienza a cargar el siguiente conjunto.

Cuestiones relacionadas