pixel rapide tracé en utilisant SWT?
Question
Je suis à la recherche d'un moyen rapide et facile à tracer des pixels colorés de façon arbitraire dans une toile de SWT. Jusqu'à présent, je me sers quelque chose comme ça:
// 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();
est horriblement horriblement lent. il faut environ une seconde et demie pour remplir une toile 300x300 pixels avec. Je peux créer une image hors écran, régler les pixels, puis dessiner l'image. Ce sera plus rapide mais je veux plus particulièrement l'effet de la peinture progressive de tracer le pixel d'image par pixel sur la toile.
La solution
Vous pouvez dessiner plusieurs images hors écran où vous remplissez progressivement la zone 300x300. De cette façon, vous pouvez contrôler la vitesse de l'image doit apparaître.
Autres conseils
Je parie que ce qui est des performances de tuer et de libérer alloue 90.000 objets Color
. Rappelez-vous, en SWT, chaque objet Color
alloue les ressources indigènes, ce qui est pourquoi vous devez dispose()
il. Cela signifie que chaque fois que vous allouez et jetez un objet Color
, vous devez passer de la machine virtuelle Java en code natif et le dos.
Pouvez-vous mettre en cache vos instances Color
alors que dans la boucle de pixel 300x300 puis disposer des objets après la boucle? Vous auriez besoin d'un cache un peu intelligent qui détient seulement un maximum de tant d'objets, et après cela disposer d'une partie de ses entrées, mais cela devrait accélérer les choses beaucoup .
Créer un objet BufferedImage:
BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
à l'intérieur de la boucle de dessin défini vos pixels:
bi.setRGB(x, y, int_rgb);
...
et enfin afficher l'image en mémoire tampon:
g.drawImage(bi, 0, 0, null);
Si vous trouvez setRGB () lent, vous pouvez accéder aux données bitmap directement:
int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
et plus tard
raster[y * 300 + x] = int_rgb;