pixels rápido plotagem usando SWT?
Pergunta
Eu estou procurando uma maneira rápida e fácil de traçar pixels arbitrariamente coloridas em uma tela SWT. Até agora eu estou usando algo parecido:
// 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();
Esta é terrivelmente terrivelmente lento. leva cerca de um segundo e meio para preencher uma tela com 300x300 pixels. Eu poderia criar uma imagem fora da tela, defina os pixels nele e, em seguida, desenhar a imagem. Este será mais rápido, mas eu quero especificamente o efeito de pintura gradual de tramar o pixel da imagem de pixel na tela.
Solução
Você pode desenhar várias imagens fora da tela onde você gradualmente preencher a área de 300x300. Desta forma, você pode controlar o quão rápido a imagem deve aparecer.
Outras dicas
Eu aposto que o que está matando desempenho está alocando e liberando 90.000 objetos Color
. Lembre-se, em SWT, cada objeto Color
aloca recursos nativos, razão pela qual você tem que dispose()
-lo. Isto significa que cada vez que você alocar e descartar um objeto Color
, você tem que transição do JVM para código nativo e nas costas.
Você pode armazenar em cache as instâncias Color
enquanto no circuito de pixel 300x300 e, em seguida, descartar os objetos após o loop? Você precisa de um esconderijo um pouco inteligente que apenas detém um máximo de tantos objetos, e depois disso irá dispor de algumas de suas entradas, mas isso deve acelerar as coisas muito .
Crie um objeto BufferedImage:
BufferedImage bi = new new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
dentro do loop desenho definir suas pixels:
bi.setRGB(x, y, int_rgb);
...
e, finalmente, mostrar a imagem tamponada:
g.drawImage(bi, 0, 0, null);
Se você encontrar setRGB () lento, você pode acessar os dados de bitmap diretamente:
int[] raster = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
e depois
raster[y * 300 + x] = int_rgb;