使用drawImage(...)和解决方案重复重新缩放和过滤图像的性能

时间:2013-01-19 05:38:56

标签: java image swing

我正在制作一个基于网格的游戏,随着窗口大小的变化调整其网格大小。我也可以在将来为照明效果应用滤色镜。我担心这段代码的性能,它会在屏幕上绘制一个网格方块中的图像。

public void drawSquares(Graphics g){
        ListIterator<Viewport> iterator = vp.listIterator();
        while(iterator.hasNext()){
            Viewport v = (Viewport)iterator.next();
            BufferedImage img = v.getSqView().getImage();
            Rectangle b = v.getPixRect();

            g.drawImage(img, b.x, b.y, b.width, b.height, v.getSqView().getBackground(), null);
        }
        return;
    }

这段代码的作用是获取图像(存储在img中)并获取它需要适合的像素矩形(存储在b中),然后在drawImage分配的空间中绘制它1}}。

drawImage表示它会动态缩放图像 - 这意味着所有图像都在每帧重新缩放。但窗口很少调整大小,因此必须浪费大量处理器时间一遍又一遍地做同样的事情。

现在我看到了这个,并决定在调整大小一次后更新所有图像,然后存储结果并能够正常绘制。

像这样:

public void resizeImage(int width, int height){
         BufferedImage resized = new BufferedImage(width, height, img.getType());
        Graphics2D g = resized.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(img, 0, 0, width, height, 0, 0, img.getWidth(), img.getHeight(), null);
        g.dispose();
        img = resized;
    }

这不起作用 - 我认为它与img = resized有关。我只是丢失了这段代码的所有图像。

我当时有几个问题。

  1. 使用drawImage重复缩放的性能成本是多少?即使窗口没有在帧之间调整大小,它是否有任何不同?
  2. 我应该如何让第二个代码段工作?出了什么问题?
  3. 如果我将一个照明过滤器应用到一块瓷砖上,那么如果我每帧运行它会占用大量的处理器时间吗? (在800x800左右的显示屏上考虑225左右的小图像)
  4. 应用照明滤镜的最佳做法是什么?我计划在整个地图上覆盖一个黑色滤光片,然后曝光光源周围的区域。
  5. 感谢您对此提供任何帮助!

2 个答案:

答案 0 :(得分:2)

调整此Grid的框架大小以获得对延迟的主观感受。使用显示here的方法来衡量延迟。在profiler

中验证您的调查结果

您没有理由不能按照建议调整List<Image>的元素大小,而add() resized个实例会在创建新列表时调整大小。

答案 1 :(得分:1)

  

使用drawImage重复缩放的性能成本是多少?是   即使窗口之间没有调整大小,它也会有所不同   帧?

你应该总是测量,但是这里确实存在性能成本,即使窗口没有调整大小,因为正如Javadoc所说,这个drawImage方法背后没有缓存。成本还取决于帧速率。

  

我应该如何让第二个代码段起作用?出了什么问题?

第二个代码片段应该没问题,我认为问题出在其他地方。尝试在“小但完整”的程序中重现问题,如果仍然看到问题,请发布另一个问题。

  

如果我将一个照明过滤器应用到一块瓷砖上,那么如果我每帧运行它会占用大量的处理器时间吗? (在800x800左右的显示屏上考虑225左右的小图像)

你应该总是测量:)

  

应用照明过滤器的最佳做法是什么?我计划在整个地图上覆盖一个黑色滤光片,然后曝光光源周围的区域。

您可以使用AlphaComposite进行此操作。