Java SWT:绘制经常更新的图像
我正在开发一个SWT应用程序,它具有高数据速率(约10hz)。当我得到新数据时,我需要重新绘制整个图像。这就是它目前的样子: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) {
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利用率有了很大的提高。如果我没有听到任何其他消息,这将是我要采用的方法。