3

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

// 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 画布大约需要一秒半的时间。我可以在屏幕外创建一个图像,在其中设置像素,然后绘制图像。这会更快,但我特别想要在画布上逐像素绘制图像的渐变绘画效果。

4

3 回答 3

4

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

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

于 2009-03-30T20:16:04.263 回答
1

您可以绘制多个屏幕外图像,逐渐填充 300x300 区域。通过这种方式,您可以控制图像出现的速度。

于 2009-03-31T00:15:32.160 回答
-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;
于 2011-12-20T13:14:17.777 回答