pixel veloce tramando utilizzando SWT?
Domanda
Sto cercando un modo semplice e veloce per tracciare arbitrariamente pixel colorati in una tela di SWT. Finora sto usando qualcosa di simile:
// 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();
Questa è terribilmente terribilmente lento. ci vuole circa un secondo e mezzo per riempire una tela 300x300 pixel con. Potrei creare un'immagine off-screen, impostare i pixel in esso e quindi disegnare l'immagine. Questo sarà più veloce ma ho specificamente desidera che l'effetto pittura graduale di aver complottato l'immagine pixel per pixel sulla tela.
Soluzione
Si potrebbe trarre diverse immagini fuori schermo in cui è gradualmente riempire l'area 300x300. In questo modo è possibile controllare la velocità deve apparire l'immagine.
Altri suggerimenti
Scommetto che le prestazioni che cosa sta uccidendo è l'allocazione e il rilascio 90.000 oggetti Color
. Ricordate, in SWT, ogni oggetto Color
alloca le risorse autoctone, che è il motivo per cui si deve dispose()
esso. Questo significa che ogni volta che si allocare e smaltire un oggetto Color
, è necessario passare da JVM al codice nativo e viceversa.
Si può memorizzare nella cache le istanze Color
mentre nel ciclo 300x300 pixel e poi smaltire gli oggetti dopo il vostro ciclo? Avreste bisogno di una cache intelligente che tiene un po 'solo un massimo di tanti oggetti, e dopo che disporrà di alcune delle sue voci, ma questo dovrebbe accelerare le cose molto .
Creare un oggetto BufferedImage:
BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
all'interno del ciclo di disegno impostare le pixel:
bi.setRGB(x, y, int_rgb);
...
e, infine, visualizzare l'immagine tamponata:
g.drawImage(bi, 0, 0, null);
Se si trova setRGB () lento, è possibile accedere direttamente ai dati bitmap:
int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
e poi
raster[y * 300 + x] = int_rgb;