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

标签 java image swing

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

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. 如果我将照明过滤器应用于图 block ,如果我每帧都运行它,是否也会占用大量的处理器时间? (在 800x800 左右的显示器上考虑 225 个左右的小图像)
  4. 应用灯光滤镜的最佳做法是什么?我计划在整个 map 上叠加一个漆黑的滤镜,然后曝光光源周围的区域。

感谢您对此的任何帮助!

最佳答案

调整此 Grid 的框架大小以获得对延迟的主观感受。使用显示的方法 here来测量延迟。在 profiler 中验证您的发现.

没有理由不能调整 List<Image> 的元素大小正如你所建议的,但是add() resized实例在创建时添加到新列表中。

关于java - 使用 drawImage(...) 重复缩放和过滤图像的性能及解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14411486/

相关文章:

html - CSS 如何在图片下方添加一个按钮

java - 如何检测 JScrollPane 滚动条是否改变可见性?

java - 在 Java Swing 中,如何获得对窗口的 Win32 窗口句柄 (hwnd) 引用?

Java 将多个JPanel 对象添加到JFrame 中

java - 将 String[] 转换为时间戳

java - 使用 selenium java 单击 div id 'addpolicy"

Java Deque 实现无法转换 Item

javascript - 如何在不放大整个页面的情况下放大 img 元素?

java - java中夏令时的时区问题

html - 在 HTML 中指定图像的宽度和高度属性是否仍然相关?