SWT:绘制经常更新的图像

时间:2014-08-14 22:12:54

标签: java image swt

我正在开发具有高数据速率(大约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方法的面板。我不确定网桥是否正在转换回图像下的图像,在这种情况下,我不确定解决方案是否会解决任何问题。

0 个答案:

没有答案