渲染大量单个像素有效吗?

时间:2015-07-11 23:54:59

标签: 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++) {
        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 ......

2 个答案:

答案 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);而不是渲染所有像素。我仍然使用块进行碰撞检测,但这样更有效。