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.

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top