2009-03-16 12 views
5

Lo que hago es renderizar una cantidad de mapas de bits en un solo mapa de bits. Podría haber cientos de imágenes y el mapa de bits que se está procesando podría tener más de 1000x1000 píxeles.Representación en un único objeto de mapa de bits a partir de múltiples hilos

Espero que se acelere este proceso mediante el uso de varios subprocesos, pero como el objeto Bitmap no es seguro para subprocesos, no se puede representar directamente de forma concurrente. Lo que estoy pensando es dividir el mapa de bits grande en secciones por CPU, renderizarlas por separado y unirlas de nuevo al final. No he hecho esto todavía en caso de que ustedes/chicas tengan mejores sugerencias.

¿Alguna idea? Gracias

Respuesta

0

Puede hacer que cada subproceso escriba en una matriz de bytes, y cuando hayan terminado, utilice una única secuencia para crear un objeto de mapa de bits a partir de las matrices de bytes. Si todos los otros procesos se han hecho antes, eso debería ser bastante rápido.

1

Lee, si va a utilizar el objeto Image GDI +, puede terminar haciendo todo el trabajo dos veces. Las secciones que generas en múltiples hilos necesitarán ser reensambladas al final de tu enfoque de dividir y conquistar, ¿y eso no vencería el propósito de dividirse en primer lugar?

Este problema solo se puede superar si está haciendo algo bastante complejo en cada una de las secciones de mapa de bits que sería mucho más tiempo de procesamiento que simplemente redibujar las subpartes de imagen en el mapa de bits grande sin tener que pasar por ese problema.

Espero que ayude. ¿Qué tipo de renderizado de imágenes estás planeando?

+0

sí, pensé que justo después de publicar, no hay nada más en marcha, aparte de dibujar n mapas de bits en uno grande, casi todo el tiempo invertido está en el método DrawImage. Necesito una nueva idea –

0

He hecho algo similar y en mi caso tenía cada bloqueo de hilo x (dependía del tamaño de la imagen y el número de hilos) muchas filas de bits en la imagen, y escribía en esos bits que ningún hilo superó sus escrituras.

4

Puede usar LockBits y trabajar en secciones individuales de la imagen.

Para ver un ejemplo de cómo se hace esto, puede consultar el código fuente de Paint.Net, especialmente el BackgroundEffectsRenderer (sí, que es un enlace a la rama mono, pero el código principal de Paint.Net parece estar solo disponible en archivos zip).

0

Un enfoque consistiría en hacer que todos los pequeños mapas de bits en un sucedáneo de mapa de bits, lo que no sería más que un int matriz de dos dimensiones (que es una especie de todo un Bitmap realmente es de todos modos). Una vez que todos los pequeños mapas de bits se combinan en la gran matriz, se hace una copia única de la gran matriz en una verdadera Bitmap de las mismas dimensiones.

Uso este enfoque (sin incluir el aspecto de subprocesos múltiples) todo el tiempo para gráficos complejos en dispositivos con Windows Mobile, ya que la memoria disponible para crear GDI + Bitmaps "reales" está severamente limitada.

También podría usar simplemente un Bitmap como estaba previsto originalmente. No se garantiza que Bitmap sea seguro para la ejecución de subprocesos, pero no estoy seguro de que eso suponga un problema siempre que pueda asegurarse de que no hay dos subprocesos que sobrescriban la misma parte del mapa de bits. Yo lo probaría, al menos.

Actualización: Acabo de volver a leer su pregunta, y me di cuenta de que probablemente no verá mucha (si la hay) mejora en la velocidad general de estas operaciones haciéndolas de subprocesos múltiples. Es el clásico problema de nueve mujeres no pueden hacer un bebé en un mes.

Cuestiones relacionadas