我正在制作一个基于网格的游戏,它会随着窗口大小的变化而调整其网格的大小。将来我也可能会为照明效果应用滤色器。我担心这段代码的性能,它在屏幕上绘制了一个网格方块中的图像。
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重复缩放的性能成本是多少?即使在帧之间没有调整窗口大小,它有什么不同吗?
- 我应该如何让第二个代码片段工作?出了什么问题?
- 如果我将照明滤镜应用到图块上,如果我每帧都运行它,是否也会消耗大量的处理器时间?(在 800x800 左右的显示器上考虑 225 个左右的小图像)
- 应用照明滤镜的最佳做法是什么?我计划在整个地图上覆盖一个黑色滤镜,然后暴露光源周围的区域。
感谢您对此的任何帮助!