在不降低fps的情况下改变运动图像的颜色

时间:2013-05-21 13:07:20

标签: java image colors bufferedimage frame-rate

我刚给我的游戏添加了一个选项,使得所有敌人的衣服颜色随机而不是普通的蓝色。我用这个代码在敌人的衬衫上绘制矩形。

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的情况下更改图像特定部分的颜色?

2 个答案:

答案 0 :(得分:0)

也许,你不应该简单地迭代每个像素。我可以看到,这将有两个缺点:

  1. 如果您有一些像素,则不想在同一图像中更改;
  2. 这真的很慢。
  3. 至于第一个参数,我们假设这不会发生,只要你的图像(显然)包含单个项目。

    至于第二个问题,实际上这是你的主要问题 - 我可以建议你在this question中查看应用答案并对其进行评论。它包含有关如何更快地完成任务的说明,而不是迭代,并且评论有一个指向示例的链接 - here it is

答案 1 :(得分:0)

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

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