我在图片上制作了一张地图,我在游戏中加载了这样的图片:
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;
数组blocks
是一个包含所有1像素块的数组。每个块都呈现如下:
g.setColor(color);
g.drawLine(x, y, x, y);
我打电话给他们是这样的:
for (int i = 0; i < getCurrentScene().blocks.size(); i++)
getCurrentScene().blocks.get(i).render(g);
它是1280x720块...这是一个更好的方法来渲染这个疯狂的块数量?因为我希望它从图像加载,即1280x720。我现在得到3 FPS ......
答案 0 :(得分:0)
对于您现在正在做的事情,如果您为每一帧执行此操作,您将为每一帧在整个地方创建新对象,并且在丢弃并允许垃圾收集器之前仅使用它们一次接他们。
创建足够的对象来表示屏幕现在的方式。 创建足够的对象来表示屏幕应该 next 不要失去那些。别再创造了。
对于你正在做的Color(int int int)事情?你可以做Color(int); new color(level.getRGB(x, y))
应该可以正常工作; java.awt.Color类可以使用一个int而不是三个。
那就是说,你仍然在初始化Color一百万次。如果你有一个有限数量的颜色,直接调用它们或以某种方式缓存它们可能是有益的,而不是在堆上不断重新创建新的Color对象。
答案 1 :(得分:0)
谢泼德在评论中解决了这个问题。我所做的是将图像渲染为g.drawImage(image, x, y);
而不是渲染所有像素。我仍然使用块进行碰撞检测,但这样更有效。