1

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

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

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. 应用照明滤镜的最佳做法是什么?我计划在整个地图上覆盖一个黑色滤镜,然后暴露光源周围的区域。

感谢您对此的任何帮助!

4

2 回答 2

2

调整此框架的大小Grid以获得对延迟的主观感觉。使用此处显示的方法来测量延迟。在分析器中验证您的发现。

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

于 2013-01-19T08:11:06.350 回答
1

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

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

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

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

如果我将照明滤镜应用到图块上,如果我每帧都运行它,是否也会消耗大量的处理器时间?(在 800x800 左右的显示器上考虑 225 个左右的小图像)

你应该总是测量:)

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

您可以为此使用AlphaComposite 。

于 2013-01-20T00:30:40.323 回答