快速重绘地图的有效方法(Java / JPanel)

时间:2011-09-25 01:52:04

标签: java performance drawing

我目前正在制作一个简单的2D自上而下的射击游戏,您可以在地图上操纵角色。图形仍处于“测试”阶段(纯色和矩形)。绘图过程如下:

  • 我将地图(这基本上只是墙或自由空间)存储为整数数组,然后循环并绘制到我的JPanel上。
  • 绘制地图后,我会浏览地图上的每个“实体”(通电,其他角色)并放置它们。
  • 最后,我画了用户的角​​色

我尝试了不同的方法,最后决定用户的角色会留在屏幕的中心,地图会围绕它移动。

目前,它正常工作但似乎。我只有4个墙,2个实体,并且正在绘制用户的角色,它的速度为90FPS,经常在60-70左右。如果游戏结束,这是可以接受的,但是我仍然有更好的图形,更多的实体,墙壁,子弹等要渲染到地图上。我已经尝试提高我的gameLoop的速度,它可以达到230 FPS,但即使这样,当我进入具有实体或墙壁的区域时,它会降至50-70。

我已经尝试将所吸引的内容仅限于可见内容,但结果总体上可以忽略甚至为负。

当前paintComponent()方法如下所示:

public void painComponent(Graphics g) {

for(int x = 0; x < Map.size.getWidth() ; x++) {

        for(int y = 0; y < Map.size.getHeight(); y++) {

                if(mapArray[y][x] == WALL) {
                    g.setColor(Color.BLACK);
                    g.fillRect(x, y, wallSize, wallSize);
                }

        }
    }

    for(int i = 0; i < map.countEntities(); i++) {

        Entity obj = map.getEntity(i);

        g.setColor(Color.WHITE);
        g.fillRect(obj.getCoords().x, obj.getCoords().y, obj.getSize().width, obj.getSize().height);

    }

    Robot bot = map.getPlayerBot();

    g.setColor(Color.BLACK);
    g.fillRect(bot.getCoords().x, bot.getCoords().y, bot.getSize().width, bot.getSize().height);
}

你们中的任何一位专家都有任何提示可以加快这一点吗?

2 个答案:

答案 0 :(得分:2)

除了以下链接中提到的答案: Java 2D Drawing Optimal PerformanceJava2D Performance IssuesJava 2D game graphicsHow to display many SVGs in Java with high performance

提高2D性能的一个常见而简单的技巧是将所有静态对象(“背景”)绘制到缓冲图像中,然后在绘制下一个图像时,您只需相应地偏移背景图像的像素,那么你只需要在屏幕的最多两个边缘而不是整个屏幕上绘制像素,这只有在你将大量图像层绘制到屏幕时才真正重要。

除此之外,请确保启用了双缓冲,以便在您仍在绘制下一张图像时,绘图不会尝试绘制到实际屏幕。

答案 1 :(得分:0)

Seph的回答得到了考虑和实施,但并没有提高速度。显然,正在绘制的图像根本不是问题。问题是我用来调用更新方法的计时器。我正在使用Timer类的一个实例,它似乎非常不可靠,特别是在这些小间隔时。在移除计时器并根据系统时钟调用我的更新方法后,我能够达到并维持极高的FPS。