Java 图形批量渲染
Java Graphics Batch Rendering
摘要:
基本上我希望能够根据 Image/Batch/Sprite 渲染项目以加快我的游戏速度,但我还必须根据 y 位置对实体进行排序,以便它以正确的顺序绘制。
问题:
理论上我该怎么做? (代码块很好,但推理更好,谢谢!)
完整情况:
我正在创建一个 2.5 D 横向卷轴器,其中我发现大约 500 fps 对于早期开发阶段来说是不错的(至少在我的垃圾计算机上)但我希望随着我的前进,它会更高稍后添加更多方面(进一步降低 fps),所以我现在想尽可能地优化。
我想知道是否可以同时渲染具有相同图像文件的所有实体,以节省加载图像文件的时间。我遇到的困难是我不能只按实体的图像文件对实体进行排序(或者至少不是我能想到的,这就是我要问的原因)因为我还需要从后到前渲染它们,因为它是 2.5 D游戏.
目前我正在将图像存储在 HashMap 中,所以它并不完全糟糕,我只是想知道我可以改进什么。
编辑:另请注意,我正在使用 Jframe 和 Jpanel 类 以及图形进行渲染
如果您不想要,则不需要 post 代码块。我只想要更多的理论推理。
谢谢!
-科雷
我想到的一个想法是,如果您有一张您知道会经常使用的图像,则可以 cache 它可能会有所帮助。
有一些方法可以使用 BufferedImage 和 ImageIcon 直接引用图像文件(我会直接 link,但我没有足够的分数 :/ )。
可能将缓存和直接引用与图像文件混合使用有助于加快该过程。除了缓存,您可能会找到一种方法将所有需要相同图像文件的对象组合在一起(这可以通过制作一个使用此精灵的所有对象的 arrayList 来完成。),所以一旦其中一个对象渲染文件,他们都在那个时候从缓存中渲染它。然后为下一个图像清除缓存。
此外,如果您有指向精灵的变量,那么您可以让对象加载变量,而不是它们都必须指向图像文件。
即
String path = "Image1.jpg";
File file = new File(path);
BufferedImage image = ImageIO.read(file);
然后您的所有对象都引用图像作为其图像的来源。但是,我不确定这是否比将每个对象单独指向文件更快,这只是一个想法。
希望其中的一些内容能回答您的问题。祝你好运!
---编辑---
所以我的下一个想法可以使用一个父 class 和/或另一个 class 来实现,它可以容纳一个 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);
}
在此,我们有一个 class (someclass) 其对象(我们只需要其中一个)将每个图像存储在数组列表中到处理最多的状态(imageIcon 或无论您使用什么都可以在这里使用)在实际将它放在 JFrame 上之前可以创建一个对象来获取所有已经呈现的图像。
这意味着此时您所要做的就是将图像添加到 JFrame 中。您不必一遍又一遍地对每个图像进行大量预处理,因为它已经准备好在 JFrame 上运行。
虽然这对渲染没有太大帮助(因为大部分是图像处理)但它确实对内存有很大帮助,因为您只是为每个处理过的图像创建 1 个,然后重新绘制相同的处理过的图像图片。
希望这种一次处理所有图像的想法可以帮助您找到一种只渲染图像一次的方法。
摘要:
基本上我希望能够根据 Image/Batch/Sprite 渲染项目以加快我的游戏速度,但我还必须根据 y 位置对实体进行排序,以便它以正确的顺序绘制。
问题:
理论上我该怎么做? (代码块很好,但推理更好,谢谢!)
完整情况:
我正在创建一个 2.5 D 横向卷轴器,其中我发现大约 500 fps 对于早期开发阶段来说是不错的(至少在我的垃圾计算机上)但我希望随着我的前进,它会更高稍后添加更多方面(进一步降低 fps),所以我现在想尽可能地优化。
我想知道是否可以同时渲染具有相同图像文件的所有实体,以节省加载图像文件的时间。我遇到的困难是我不能只按实体的图像文件对实体进行排序(或者至少不是我能想到的,这就是我要问的原因)因为我还需要从后到前渲染它们,因为它是 2.5 D游戏.
目前我正在将图像存储在 HashMap 中,所以它并不完全糟糕,我只是想知道我可以改进什么。
编辑:另请注意,我正在使用 Jframe 和 Jpanel 类 以及图形进行渲染
如果您不想要,则不需要 post 代码块。我只想要更多的理论推理。 谢谢!
-科雷
我想到的一个想法是,如果您有一张您知道会经常使用的图像,则可以 cache 它可能会有所帮助。
有一些方法可以使用 BufferedImage 和 ImageIcon 直接引用图像文件(我会直接 link,但我没有足够的分数 :/ )。
可能将缓存和直接引用与图像文件混合使用有助于加快该过程。除了缓存,您可能会找到一种方法将所有需要相同图像文件的对象组合在一起(这可以通过制作一个使用此精灵的所有对象的 arrayList 来完成。),所以一旦其中一个对象渲染文件,他们都在那个时候从缓存中渲染它。然后为下一个图像清除缓存。
此外,如果您有指向精灵的变量,那么您可以让对象加载变量,而不是它们都必须指向图像文件。
即
String path = "Image1.jpg";
File file = new File(path);
BufferedImage image = ImageIO.read(file);
然后您的所有对象都引用图像作为其图像的来源。但是,我不确定这是否比将每个对象单独指向文件更快,这只是一个想法。
希望其中的一些内容能回答您的问题。祝你好运!
---编辑---
所以我的下一个想法可以使用一个父 class 和/或另一个 class 来实现,它可以容纳一个 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);
}
在此,我们有一个 class (someclass) 其对象(我们只需要其中一个)将每个图像存储在数组列表中到处理最多的状态(imageIcon 或无论您使用什么都可以在这里使用)在实际将它放在 JFrame 上之前可以创建一个对象来获取所有已经呈现的图像。
这意味着此时您所要做的就是将图像添加到 JFrame 中。您不必一遍又一遍地对每个图像进行大量预处理,因为它已经准备好在 JFrame 上运行。
虽然这对渲染没有太大帮助(因为大部分是图像处理)但它确实对内存有很大帮助,因为您只是为每个处理过的图像创建 1 个,然后重新绘制相同的处理过的图像图片。
希望这种一次处理所有图像的想法可以帮助您找到一种只渲染图像一次的方法。