1

概括:

基本上我希望能够根据它们的 Image/Batch/Sprite 渲染项目以加快我的游戏速度,但我还必须根据 y 位置对实体进行排序,以便它以正确的顺序绘制。

问题:

我怎么能在理论上做到这一点?(代码块很好,但推理更好,谢谢!)


完整情况:

我正在创建一个 2.5 D 横向滚动条,在其中我发现〜 500 fps 对于早期开发阶段(至少在我的垃圾计算机上)来说是不错的,但我希望它更高,因为我将添加更多方面稍后(进一步降低 fps),所以我现在想尽可能优化。

我想知道是否可以同时使用相同的图像文件渲染所有实体,以节省加载图像文件的时间。我遇到的困难是我不能只按图像文件对实体进行排序(或者至少不是我能想到的,这就是我要问的原因),因为我还需要从后到前渲染它们,因为它是 2.5 D 游戏。

现在我将图像存储在 HashMap 中,所以它并不完全糟糕,我只是想知道我可以改进什么。

编辑:还要注意我正在使用带有 Graphics 的 Jframe 和 Jpanel 类进行渲染

如果您不想要,您不需要发布代码块。我只是想要更多的理论推理。谢谢!

-科雷

4

1 回答 1

2

想到的一个想法是,如果您有一张您知道会经常使用的图像,您可以缓存它,这可能会有所帮助。

有一些方法可以使用 BufferedImage 和 ImageIcon 直接引用图像文件(我会直接链接,但我没有足够的点数:/)。

可能将缓存和直接引用与图像文件混合可以帮助加快该过程。除了缓存之外,您还可以找到一种方法将需要相同图像文件的所有对象组合在一起(这可以通过将使用此精灵的所有对象创建一个 arrayList 来完成。),因此一旦其中一个对象渲染文件时,他们都从缓存中渲染它。然后为下一个图像清除缓存。

此外,如果你有指向你的精灵的变量,那么你可以让对象加载变量,而不是它们都必须指向图像文件。
IE

String path = "Image1.jpg";
File file = new File(path);
BufferedImage image = ImageIO.read(file);

然后所有对象都引用图像作为其图像的来源。但是,我不确定这是否比单独将每个对象指向文件更快,这只是一个想法。

希望其中一些回答您的要求。祝你好运!

- -编辑 - -

因此,我的下一个想法可以使用父类或只是另一个包含 ArrayList 的类来实现。所以这个想法是你不想每次你想加载图像时都使用方法 images.get(imgPath) 。

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.ImageIcon;

class SomeClass{

    ImageIcon imgOne = new ImageIcon(new BufferedImage(images.get(imgPath)))
    ImageIcon imgTwo = new ImageIcon(new BufferedImage(images.get(imgPathTwo)))
    private ArrayList<ImageIcon> imagesHolder = new ArrayList<ImageIcon>(){{
        add(imgOne);
        add(imgTwo);
    }};

    public ImageIcon getImageIcon(int index){
        return imagesHolder.get(index);
    }
}

class test{
    SomeClass imageHolder = new SomeClass();

    JLabel label = new JLabel(imageHolder.getImageIcon(0));
    JFrame f = new JFrame();
    f.getContentPane().add(label);
}

在此,我们有一个类(someclass),其对象(我们只需要其中一个)在实际放置之前将数组列表中的每个图像存储到处理最多的状态(imageIcon 或您使用的任何东西都可以在这里使用) JFrame 可以创建一个对象来获取所有已经渲染的图像。

这意味着此时您所要做的就是将图像添加到 JFrame。您不必一遍又一遍地对每个图像进行大量预处理,因为它已经准备好在 JFrame 上进行。

虽然这对渲染没有太大帮助(因为其中大部分是图像处理),但它确实对内存有很大帮助,因为您只是为每个处理过的图像创建 1 个并重新绘制相同的处理过的图像。

希望这种一次性处理所有图像的想法可以帮助您找到一种只需要渲染一次图像的方法。

于 2016-01-12T06:21:09.110 回答