【问题标题】:Fast pixel plotting using SWT?使用 SWT 进行快速像素绘图?
【发布时间】:2010-10-16 11:09:30
【问题描述】:

我正在寻找一种快速简便的方法来在 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();

这非常慢。用像素填充 300x300 画布大约需要一秒半的时间。 我可以在屏幕外创建一个图像,在其中设置像素,然后绘制图像。这会更快,但我特别想要在画布上逐像素绘制图像的渐变绘画效果。

【问题讨论】:

    标签: java canvas swt plot pixel


    【解决方案1】:

    我敢打赌,正在扼杀性能的是分配和释放 90,000 个Color 对象。请记住,在 SWT 中,每个 Color 对象分配本机资源,这就是为什么您必须 dispose() 它。这意味着每次分配和处置 Color 对象时,都必须从 JVM 转换到本机代码并返回。

    您能否在 300x300 像素循环中缓存 Color 实例,然后在循环后处理对象?您需要一个有点智能的缓存,最多只能保存这么多对象,然后处理其中的一些条目,但这应该会大大加快速度。

    【讨论】:

      【解决方案2】:

      您可以在逐渐填充 300x300 区域的位置绘制多个屏幕外图像。这样您就可以控制图像的显示速度。

      【讨论】:

      • 这实际上是我最终做的。一次填充扫描线并绘制扫描线。这种方法大约快 10 倍。绝对惊人。
      【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2019-09-06
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        相关资源
        最近更新 更多