Java图形批渲染
总结: 基本上,我希望能够根据项目的图像/批处理/精灵渲染项目,以加快我的游戏速度,但我还必须根据y位置对实体进行排序,以便它以正确的顺序绘制 问题: 理论上我怎么能做到?(代码块很好,但是推理更好,谢谢!)Java图形批渲染,java,optimization,rendering,2.5d,Java,Optimization,Rendering,2.5d,总结: 基本上,我希望能够根据项目的图像/批处理/精灵渲染项目,以加快我的游戏速度,但我还必须根据y位置对实体进行排序,以便它以正确的顺序绘制 问题: 理论上我怎么能做到?(代码块很好,但是推理更好,谢谢!) 全部情况: 我正在创建一个2.5D侧边滚动条,在其中我发现~500fps对于开发的早期阶段来说是不错的(至少在我的垃圾计算机上),但我希望这个速度更高,因为我将在以后添加更多方面(进一步减少fps),所以我现在希望尽可能优化 我想知道的是,是否有可能同时渲染具有相同图像文件的所有实体,以
全部情况: 我正在创建一个2.5D侧边滚动条,在其中我发现~500fps对于开发的早期阶段来说是不错的(至少在我的垃圾计算机上),但我希望这个速度更高,因为我将在以后添加更多方面(进一步减少fps),所以我现在希望尽可能优化 我想知道的是,是否有可能同时渲染具有相同图像文件的所有实体,以节省加载图像文件的时间。我所面临的困难是,我不能仅仅按照它们的图像文件对实体进行排序(或者至少不是我能想到的,这就是为什么我这么问),因为我还需要从后到前渲染它们,因为这是一个2.5D游戏 现在我正在将图像存储在HashMap中,所以这并不完全糟糕,我只是想知道我可以改进什么 编辑:还要注意的是,我使用带有图形的Jframe和Jpanel类进行渲染 如果不想,您不需要发布代码块。我只是想要更多的理论推理。 谢谢
-Kore想到的一个想法是,如果你有一个你知道会被大量使用的图像,你可以使用它,这可能会有所帮助 有几种方法可以使用BuffereImage和ImageIcon直接引用图像文件(我会直接链接,但我没有足够的点:/) 可能将缓存和直接引用与图像文件混合使用有助于加快进程。与缓存一起,您可能会找到一种方法,将需要相同图像文件的所有对象分组在一起(这可以通过创建使用此精灵的所有对象的arrayList来完成),因此,一旦其中一个对象渲染文件,它们都会在该时间从缓存中渲染该文件。然后为下一个图像清除缓存 此外,如果要让变量指向精灵,则可以让对象加载变量,而不是所有对象都指向图像文件。
i、 e
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);
}
导入java.awt.image.buffereImage;
导入java.util.ArrayList;
导入javax.swing.ImageIcon;
上课{
ImageIcon imGoe=新的ImageIcon(新的缓冲区图像(images.get(imgPath)))
ImageIcon imgTwo=新的ImageIcon(新的缓冲区图像(images.get(imgPathTwo)))
私有ArrayList imagesHolder=新ArrayList(){{
添加(imgOne);
添加(imgTwo);
}};
公共图像图标getImageIcon(int索引){
返回imagesHolder.get(索引);
}
}
课堂测试{
SomeClass imageHolder=新的SomeClass();
JLabel label=新的JLabel(imageHolder.getImageIcon(0));
JFrame f=新的JFrame();
f、 getContentPane().add(标签);
}
在这里,我们有一个类(someclass),它的对象(我们只需要其中一个)是将arraylist中的每个图像存储到最处理的状态(这里可以使用imageIcon或您正在使用的任何东西),然后再实际将其放在JFrame上,可以从中创建一个对象以获取所有已渲染的图像
这意味着此时您所要做的就是将图像添加到JFrame。你不必一次又一次地对每个图像进行大量的预处理,因为它已经准备好在JFrame上运行了
虽然这对渲染没有特别大的帮助(因为这大部分是对图像的处理),但它确实对内存有很大的帮助,因为您只需为每个处理过的图像创建一个,然后重新绘制相同的处理过的图像
希望这种一次性处理所有图像的想法能够帮助您找到只渲染一次图像的方法 此外,您可能会在at+1上找到更多关于“缓存”的信息的专家知识,我不知道这一点,但我想当我说我正在将它们存储在HashMap中时,我应该更清楚。实际上,我将一个图像对象存储在一个HashMap中,该HashMap按imagePath排序,这样,如果我调用images.get(imgPath),它将返回一个对图像对象的引用,而不是每次简单地加载它。我更想要的是找到一种根据实体的图像对其进行排序的方法,这样我就不必为每个实体调用images.get(imgPath)方法,相反,我可以重用它,这没有问题。我是一名高中生,有一天我看到自己在电子游戏行业工作,所以这个问题引起了我的兴趣。对不起,我不是想按回车键。我接下来的回答会慢慢来,因为我现在正在研究细节。我希望我是在行业XD,我现在是HS的大三学生。我在我的原始评论中添加了一个编辑。这可能没有什么意义,也不能完全回答你的问题,我希望它能有所帮助。我现在住的地方是凌晨1点,所以我明天可以的时候会检查一下。祝你好运