我正在制作一个基于网格的游戏,随着窗口大小的变化调整其网格大小。我也可以在将来为照明效果应用滤色镜。我担心这段代码的性能,它会在屏幕上绘制一个网格方块中的图像。
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
有关。我只是丢失了这段代码的所有图像。
我当时有几个问题。
感谢您对此提供任何帮助!
答案 0 :(得分:2)
调整此Grid
的框架大小以获得对延迟的主观感受。使用显示here的方法来衡量延迟。在profiler。
您没有理由不能按照建议调整List<Image>
的元素大小,而add()
resized
个实例会在创建新列表时调整大小。
答案 1 :(得分:1)
使用drawImage重复缩放的性能成本是多少?是 即使窗口之间没有调整大小,它也会有所不同 帧?
你应该总是测量,但是这里确实存在性能成本,即使窗口没有调整大小,因为正如Javadoc所说,这个drawImage方法背后没有缓存。成本还取决于帧速率。
我应该如何让第二个代码段起作用?出了什么问题?
第二个代码片段应该没问题,我认为问题出在其他地方。尝试在“小但完整”的程序中重现问题,如果仍然看到问题,请发布另一个问题。
如果我将一个照明过滤器应用到一块瓷砖上,那么如果我每帧运行它会占用大量的处理器时间吗? (在800x800左右的显示屏上考虑225左右的小图像)
你应该总是测量:)
应用照明过滤器的最佳做法是什么?我计划在整个地图上覆盖一个黑色滤光片,然后曝光光源周围的区域。
您可以使用AlphaComposite进行此操作。