使用SWT进行快速像素绘图?

时间:2009-03-30 19:07:10

标签: java canvas swt plot pixel

我正在寻找一种快速简便的方法来绘制SWT Canvas中任意颜色的像素。 到目前为止,我正在使用类似的东西:

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

这非常缓慢。用像素填充300x300画布需要大约一秒半。 我可以在屏幕外创建一个图像,设置其中的像素,然后绘制图像。这会更快,但我特别想要在画布上逐个像素地绘制图像的逐渐绘画效果。

3 个答案:

答案 0 :(得分:4)

我敢打赌,杀死性能的原因是分配和释放90,000个Color个对象。请记住,在SWT中,每个Color对象都会分配本机资源,这就是为什么必须dispose()它。这意味着每次分配和处理Color对象时,都必须从JVM转换为本机代码并返回。

您可以在300x300像素循环中缓存Color实例,然后在循环后处理对象吗?你需要一个有点智能的缓存,它只能容纳这么多的对象,之后会丢弃它的一些条目,但是这样可以加快极大的速度。

答案 1 :(得分:1)

您可以绘制几个屏幕外图像,逐渐填充300x300区域。这样您就可以控制图像的显示速度。

答案 2 :(得分:-3)

创建一个BufferedImage对象:

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

在绘图循环内设置像素:

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

最后显示缓冲的图像:

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

如果发现setRGB()速度很慢,则可以直接访问位图数据:

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

以后

raster[y * 300 + x] = int_rgb;