2009-03-30 8 views
3

Ich bin auf der Suche nach einer schnellen und einfachen Möglichkeit, beliebig farbige Pixel in einem SWT Canvas zu plotten. Bisher bin ich mit so etwas wie das:Schnelles Pixelplotten mit SWT?

// 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(); 

Diese schrecklich schrecklich langsam ist. Es dauert etwa anderthalb Sekunden, um eine 300x300 Leinwand mit Pixeln zu füllen. Ich könnte ein Bild außerhalb des Bildschirms erstellen, die Pixel darin einstellen und dann das Bild zeichnen. Dies wird schneller sein, aber ich möchte speziell den allmählichen Mal-Effekt haben, indem ich das Bild Pixel für Pixel auf die Leinwand auftrage.

Antwort

1

Sie könnten mehrere Offscreen-Bilder zeichnen, bei denen Sie den 300x300-Bereich allmählich füllen. Auf diese Weise können Sie steuern, wie schnell das Bild angezeigt werden soll.

+0

Das ist eigentlich das, was ich tun endete. Scanzeile auf einmal auffüllen und die Scanlinien zeichnen. Diese Methode ist etwa 10 mal schneller. Einfach unglaublich. – shoosh

4

Ich wette, dass die Tötungsleistung 90.000 Color Objekte zuweist und freigibt. Denken Sie daran, in SWT, jeder Objekt reserviert native Ressourcen, weshalb Sie müssen dispose() es. Dies bedeutet, dass Sie jedes Mal, wenn Sie ein Objekt zuweisen und entsorgen, von der JVM in den systemeigenen Code und zurück wechseln müssen.

Können Sie Ihre Instanzen in der 300x300 Pixel Schleife zwischenspeichern und dann die Objekte nach Ihrer Schleife entsorgen? Du brauchst einen etwas intelligenten Cache, der nur so viele Objekte enthält und danach einige seiner Einträge entfernt, aber das sollte die Dinge beschleunigen groß.

-3

erstellen BufferedImage Objekt:

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

in der Zeichnung Schleife stellen Sie Ihre Pixel:

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

und schließlich das gepufferte Bild anzuzeigen:

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

Wenn Sie setRGB finden () langsam, Sie können direkt auf die Bitmap-Daten zugreifen:

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

und später

raster[y * 300 + x] = int_rgb; 
+1

'BufferedImage' funktioniert nur mit AWT/Swing. – pvorb