Frage

Ich bin für eine schnelle und einfache Weise beliebig farbige Pixel in einem SWT Leinwand zu zeichnen. Bisher bin ich mit etwas wie folgt aus:

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

Das ist schrecklich schrecklich langsam. Es dauert etwa eine Sekunde und eine Hälfte eine 300x300 Leinwand mit Pixeln zu füllen. Ich konnte ein Bild off-screen, stellen die Pixel in es erstellen und dann das Bild zeichnen. Dies wird schneller sein, aber ich mag speziell die allmähliche Malerei Wirkung das Bild Pixel für Pixel auf der Leinwand aufgetragen wird.

War es hilfreich?

Lösung

Sie könnten mehr Off-Screen-Bilder zeichnen, wo Sie den 300x300 Bereich allmählich füllen. Auf diese Weise können Sie steuern, wie schnell das Bild erscheinen soll.

Andere Tipps

Ich wette dass das, was tötet Leistung zuteilt und 90.000 Color Objekte freizugeben. Denken Sie daran, in SWT, jede Color Objekt nativen Ressourcen zuweist, weshalb Sie es dispose() haben. Das bedeutet, jedes Mal, wenn Sie ein Color Objekt zuweisen und darüber verfügen, müssen Sie nativen Code von der JVM für den Übergang und zurück.

Können Sie Ihre Color Instanzen während in der 300x300 Pixel Schleifen-Cache und dann die Objekte nach der Schleife entsorgen? Sie würden einen etwas intelligenter Cache benötigen, die nur maximal so viele Objekte enthält, und danach von einigen seiner Einträge verfügen, aber dies sollte die Dinge stark beschleunigen.

Erstellen Sie ein BufferedImage Objekt:

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

innerhalb der Zeichnungs Schleife stellen Sie Ihre Pixel:

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

und schließlich das gepufferte Bild angezeigt werden:

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

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

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

und später

raster[y * 300 + x] = int_rgb;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top