我正在寻找一种快速简便的方法来绘制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画布需要大约一秒半。 我可以在屏幕外创建一个图像,设置其中的像素,然后绘制图像。这会更快,但我特别想要在画布上逐个像素地绘制图像的逐渐绘画效果。
答案 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;