【问题标题】:Java Graphics Batch RenderingJava 图形批量渲染
【发布时间】:2016-01-09 06:53:22
【问题描述】:

总结:

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

问题:

理论上我该怎么做? (代码块很好,但推理更好,谢谢!)


完整情况:

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

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

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

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

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

-科雷

【问题讨论】:

    标签: java optimization rendering 2.5d


    【解决方案1】:

    想到的一个想法是,如果您知道一张图片会被大量使用,您可以cache 它,这可能会有所帮助。

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

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

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

    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 个并重新绘制相同的已处理图像。

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

    【讨论】:

    • 另外,您还可以在gamedev.stackexchange.com找到更多专业知识
    • +1 有关“缓存”的信息,我不知道,但我想当我说我将它们存储在 HashMap 中时我应该更清楚。我实际上将一个 Image 对象存储在按 imagePath 排序的 HashMap 中,这样如果我调用 images.get(imgPath) 它返回对 Image 对象的引用,我不是每次都简单地加载它。我更需要的是找到一种基于图像对实体进行排序的方法,这样我就不必为每个实体调用 images.get(imgPath) 方法,而是可以重用它
    • 没问题。我是一名高中生,有一天我看到自己在电子游戏行业工作,所以这个问题让我很感兴趣。抱歉不是按回车的意思。随着我现在正在研究细节,我的其余部分会慢慢回复。
    • 我希望我在这个行业 XD 我现在是 HS 的大三学生
    • 好的。我对我的原始评论添加了一个编辑。它可能没有多大意义,也没有完全回答你的问题,我希望它有所帮助。我住的地方现在是凌晨 1 点,所以我明天会检查一下。祝你好运!
    猜你喜欢
    • 2011-09-14
    • 2016-03-19
    • 2018-11-02
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多