Pregunta

Estoy buscando una manera rápida y fácil de trazar arbitrariamente píxeles de colores en un lienzo SWT. Hasta el momento estoy usando algo así:

// initialization:
GC gc = new GC(canvas);

// inside the drawing loop:
Color cc = new Color(display, r, g, b);
gc.setForeground(cc);
gc.drawPoint(x, y);
cc.dispose();

Esto es terriblemente terriblemente lento. se tarda aproximadamente un segundo y medio para llenar un lienzo de 300x300 píxeles con. Podría crear una imagen fuera de la pantalla, ajustar los píxeles en ella y luego dibujar la imagen. Esto será más rápido, pero quiero específicamente el efecto gradual de la pintura trazado de la imagen píxel a píxel en el lienzo.

¿Fue útil?

Solución

Se puede dibujar varias imágenes fuera de la pantalla cuando usted llena gradualmente el área de 300x300. De esta manera se puede controlar la velocidad debería aparecer la imagen.

Otros consejos

apuesto a que el rendimiento de lo que está matando es la asignación y liberación de 90.000 objetos Color. Recuerde, en SWT, cada objeto Color asigna recursos nativos, por lo que usted tiene que dispose() ella. Esto significa que cada vez que se asigna un objeto y disponer Color, hay que pasar de la JVM a código nativo y la espalda.

Se puede almacenar en caché las instancias Color mientras que en el bucle de 300x300 píxeles y luego deshacerse de los objetos después de su bucle? Se necesitaría una caché inteligente algo que sólo tiene un máximo de tantos objetos, y después de que se deshará de algunos de sus entradas, pero esto debe acelerar las cosas en gran medida .

Crea un objeto BufferedImage:

BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);

dentro del bucle dibujo establecer sus píxeles:

bi.setRGB(x, y, int_rgb);
...

y, finalmente, mostrar la imagen tamponada:

g.drawImage(bi, 0, 0, null); 

Si encuentra setRGB () lenta, se puede acceder a los datos de mapa de bits directamente:

int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();

y luego

raster[y * 300 + x] = int_rgb;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top