使用SWT快速绘制像素?

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

这太慢了,用1.5秒的时间才能填充一个300x300像素的画布。 我可以在屏幕外创建一个图像,在其中设置像素,然后绘制该图像。这样会更快,但我特别想要逐像素地在画布上绘制图像的渐进式绘画效果。

3个回答

4
我敢打赌,影响性能的原因是分配和释放了9万个“Color”对象。请记住,在SWT中,每个“Color”对象都会分配本地资源,这就是为什么您必须使用“dispose()”的原因。这意味着每次您分配和释放一个“Color”对象时,您都必须从JVM转换到本地代码,然后再返回。
在300x300像素循环中,您能否缓存“Color”实例,然后在循环结束后处理这些对象?您需要一个相当智能的缓存,只保留最多数量的对象,并且在达到上限后将处理掉其中的一些条目,但这应该可以大大加快速度。

1
你可以绘制几个离屏图像,逐渐填充300x300的区域。这样你就可以控制图像出现的速度。

这实际上是我最终采取的做法。每次填充扫描线并绘制扫描线。这种方法大约快了10倍。真是太神奇了。 - shoosh

-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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接