0

我刚刚在我的游戏中添加了一个选项,使所有敌人的衣服都具有随机颜色,而不是常规的蓝色。我使用此代码在敌人的衬衫上绘制矩形。

BufferedImage image = new BufferedImage(z.getWidth(), z.getHeight(), 
    BufferedImage.TYPE_4BYTE_ABGR);
try{
    image = ImageIO.read(new File("C:\\Program Files (x86)\\ZombieGame\\
        Zombie.png"));
}catch (IOException ex) {
}
int j, k, red, green, blue;
    for(j = 0; j < z.getWidth(); j++){
        for(k = 0; k < z.getHeight(); k++){
            Color c = new Color(image.getRGB(j, k));
            red = c.getRed();
            green = c.getGreen();
            blue = c.getBlue();
            if(red == 0 && green == 0 && blue == 178){
                g2d.setColor(Color.red);
                Rectangle r = new Rectangle(j,k, 1, 1);
                Path2D.Double rect = new Path2D.Double(r, at);
                g2d.fill(rect);
            }
        }
    }

问题是当我应用它时,游戏运行速度会慢两倍(在我添加此代码之前,我得到了稳定的 80 fps,但随着我添加它,我得到了大约 30 fps)。我的问题是,是否有更好的方法可以在不大幅降低 fps 的情况下更改图像特定部分的颜色?

4

2 回答 2

0

也许,您不应该简单地迭代每个像素。如我所见,这将有两个缺点:

  1. 如果你有一些像素,你不想在同一个图像中改变;
  2. 它真的很慢。

至于第一个参数,假设这不会发生,只要您的图像(显然)包含单个项目。

至于第二个问题,这实际上是您的主要问题 - 我可以建议您在这个问题中寻找应用答案并对其进行评论。它包含有关如何比迭代更快地完成任务的描述,并且评论有一个示例链接 -这里是

于 2013-05-21T14:03:16.793 回答
0

制作原始图像的副本,更改您想要更改的像素(任何适合您的方法,无论是绘制矩形还是用 getRGB/setRRG 替换颜色值)。记住更改后的图像并将其重新用于相同颜色的所有后续渲染。

这样,您只需支付一次更改颜色的费用,而不是每次需要绘制图像时。如果您没有过多的图像,您可能希望在开始游戏之前将它们全部加载。如果有太多图像无法全部加载,可以使用某种 LRU 缓存将最常用的图像保存在内存中。

于 2013-05-21T14:26:36.160 回答