Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 渲染大量单个像素是否高效?_Java_Performance_Render - Fatal编程技术网

Java 渲染大量单个像素是否高效?

Java 渲染大量单个像素是否高效?,java,performance,render,Java,Performance,Render,我在游戏中加载的图像上绘制了一张地图,如下所示: List<Block> tempBlocks = new ArrayList<Block>(); BufferedImage level = levels.get(currentLevel); for (int x = 0; x < level.getWidth(); x++) { for (int y = 0; y < level.getHeight(); y++) { tempBlo

我在游戏中加载的图像上绘制了一张地图,如下所示:

List<Block> tempBlocks = new ArrayList<Block>();
BufferedImage level = levels.get(currentLevel);
for (int x = 0; x < level.getWidth(); x++) {
    for (int y = 0; y < level.getHeight(); y++) {
        tempBlocks.add(new Block(x, y, new Color(level.getRGB(x, y))));
    }
}

blocks = tempBlocks;
isLoading = false;
g.setColor(color);
g.drawLine(x, y, x, y);
for (int i = 0; i < getCurrentScene().blocks.size(); i++) 
    getCurrentScene().blocks.get(i).render(g);
我这样称呼他们:

List<Block> tempBlocks = new ArrayList<Block>();
BufferedImage level = levels.get(currentLevel);
for (int x = 0; x < level.getWidth(); x++) {
    for (int y = 0; y < level.getHeight(); y++) {
        tempBlocks.add(new Block(x, y, new Color(level.getRGB(x, y))));
    }
}

blocks = tempBlocks;
isLoading = false;
g.setColor(color);
g.drawLine(x, y, x, y);
for (int i = 0; i < getCurrentScene().blocks.size(); i++) 
    getCurrentScene().blocks.get(i).render(g);
for(int i=0;i

是1280x720个街区。。。这是一个更好的方式来渲染这个疯狂的块数吗?因为我想从一个图像加载它,它是1280x720。我现在得到了3 FPS…

对于您现在正在做的事情,如果您对每一帧都这样做,那么您将为每一帧创建新的对象,并且在丢弃之前只使用一次,并允许垃圾收集器拾取它们

创建足够的对象来表示屏幕现在的状态。 创建足够的对象来表示下一步屏幕的显示方式。
别丢了。不要再创造了

对于你正在做的颜色(int)的事情?你可以只做颜色(int)<代码>新颜色(level.getRGB(x,y))
应该可以正常工作;java.awt.Color类可以接受一个int而不是三个int


也就是说,你仍然会初始化颜色一百万次。如果颜色数量有限,那么直接调用它们或以某种方式缓存它们,而不是在堆上不断地重新创建新的颜色对象,这可能是有益的。

Shepard在注释中解决了这个问题。我所做的是将图像渲染为
g.drawImage(图像,x,y)而不是渲染所有像素。我仍然使用块进行碰撞检测,但这是一种更有效的方法

为什么不直接渲染图像?@Shepard我想要碰撞检测,所以你是从图像创建贴图的。你是什么意思?当发生碰撞时,您必须更改某些像素的颜色?好的,构建块数组,但仅用于碰撞检测。保留图像并使用自定义JPanel进行渲染,请参见。如果您需要更新图像数据,例如将播放器绘制到新位置,可以通过BuffereImage.setRGB方法进行更新。我相信你的帧率会增加很多@谢泼德,非常感谢!我从未想过不渲染这些块,而是将它们用作碰撞检测并渲染图像!:循环的数据仅添加一次块,直到更改贴图为止。每帧发生的事情是第二个两个代码块。但是谢谢你的颜色反馈!我不知道只需要一个int:D