我正在制作一个基于网格的游戏,它会随着窗口大小的变化而调整其网格的大小。我也可能在未来应用彩色滤光片来实现照明效果。我担心这段代码的性能,它会在屏幕上绘制一个网格方 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
有关。我只是用这段代码丢失了所有图像。
那我有几个问题。
- 使用 drawImage 重复缩放的性能成本是多少?即使在帧之间没有调整窗口大小,它有什么不同吗?
- 我应该如何让第二个代码片段起作用?出了什么问题?
- 如果我将照明过滤器应用于图 block ,如果我每帧都运行它,是否也会占用大量的处理器时间? (在 800x800 左右的显示器上考虑 225 个左右的小图像)
- 应用灯光滤镜的最佳做法是什么?我计划在整个 map 上叠加一个漆黑的滤镜,然后曝光光源周围的区域。
感谢您对此的任何帮助!
最佳答案
调整此 Grid
的框架大小以获得对延迟的主观感受。使用显示的方法 here来测量延迟。在 profiler 中验证您的发现.
没有理由不能调整 List<Image>
的元素大小正如你所建议的,但是add()
resized
实例在创建时添加到新列表中。
关于java - 使用 drawImage(...) 重复缩放和过滤图像的性能及解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14411486/