我正在开发具有高数据速率(大约10hz)的SWT应用程序。当我获得新数据时,我需要重绘整个图像。这就是它目前的样子:
public class ImageRenderer implements PaintListener
{
private final ImageData _ImageData;
public ImageRenderer(int pWidth, int pHeight, PaletteData pPalet, int pImageDepth)
{
_ImageData = new ImageData(pWidth, pHeight, pPalet, pImageDepth);
}
public void updateData(byte [] pRaster)
{
_ImageData.data = pRaster;
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
redraw();
}
});
}
@Override
public void paintControl(PaintEvent pEvent)
{
Image image = new Image(pEvent.gc.getDevice(), imageData);
pEvent.gc.setAdvanced(true);
pEvent.gc.setAntialias(SWT.OFF);
pEvent.gc.drawImage(
image,0,0,imageData.width,imageData.height,
0,0,imageData.width, imageData.height);
image.dispose();
}
}
我目前在Fedora 9上运行。当执行此代码时,我会看到JVM的CPU以及X的CPU峰值。当我使用可视VM连接到JVM时,我看到了以下内容:
org.eclipse.swt.internal.gtk.OS._gdk_pixbuf_render_to_drawable [native](96%)
我怀疑这可能与我创建的图像数量有关。当我在AWT-Swing中编写类似的应用程序时,我创建了一个BufferedImage,更新了栅格并调用了重绘。图像创建一次,图像很容易绘制。
理想情况下,我想做类似的事情。我希望有一种方法可以绘制ImageData的内容,而不必每次都创建一个图像。如果我卸载图像的创建,关闭显示线程,我看到相同的行为。
我考虑过使用SWT_AWT桥来创建一个使用上面提到的BufferedImage方法的面板。我不确定网桥是否正在转换回图像下的图像,在这种情况下,我不确定解决方案是否会解决任何问题。