Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT:绘制经常更新的图像_Java_Image_Swt - Fatal编程技术网

Java SWT:绘制经常更新的图像

Java SWT:绘制经常更新的图像,java,image,swt,Java,Image,Swt,我正在开发一个SWT应用程序,它具有高数据速率(约10hz)。当我得到新数据时,我需要重新绘制整个图像。这就是它目前的样子: public class ImageRenderer implements PaintListener { private final ImageData _ImageData; public ImageRenderer(int pWidth, int pHeight, PaletteData pPalet, int pImageDepth) {

我正在开发一个SWT应用程序,它具有高数据速率(约10hz)。当我得到新数据时,我需要重新绘制整个图像。这就是它目前的样子:

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

}
我现在用的是Fedora9。当执行此代码时,我看到JVM的CPU以及X的CPU峰值。当我使用visual VM连接到JVM时,我看到了以下内容:

org.eclipse.swt.internal.gtk.OS._gdk_pixbuf_render_to_drawable[本机](96%)

我怀疑这可能与我正在创建的图像数量有关。当我在AWT Swing中编写类似的应用程序时,我会创建一个BuffereImage,更新光栅并调用repaint。图像创建一次,并且图像很容易绘制

理想情况下,我想做类似的事情。我希望能够有一种方法来绘制ImageData的内容,而不必每次都创建一个图像。如果我从显示线程中卸载图像的创建,我会看到相同的行为


我考虑使用SWT_AWT桥来创建一个使用上述BuffereImage方法的面板。我不确定这座桥是否正在转换回封面下的图像,在这种情况下,我不确定这个解决方案能解决任何问题

我刚刚写了一个概念证明,它使用SWT_AWT桥添加了一个带有自定义paintComponent方法的JPanel,我看到JVM和X上的CPU利用率有了很大的提高。如果我没有听到任何其他消息,这将是我要采用的方法。