我目前正在制作一个简单的2D自上而下的射击游戏,您可以在地图上操纵角色。图形仍处于“测试”阶段(纯色和矩形)。绘图过程如下:
我尝试了不同的方法,最后决定用户的角色会留在屏幕的中心,地图会围绕它移动。
目前,它正常工作但似乎慢。我只有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);
}
你们中的任何一位专家都有任何提示可以加快这一点吗?
答案 0 :(得分:2)
除了以下链接中提到的答案: Java 2D Drawing Optimal Performance, Java2D Performance Issues, Java 2D game graphics 和How to display many SVGs in Java with high performance
提高2D性能的一个常见而简单的技巧是将所有静态对象(“背景”)绘制到缓冲图像中,然后在绘制下一个图像时,您只需相应地偏移背景图像的像素,那么你只需要在屏幕的最多两个边缘而不是整个屏幕上绘制像素,这只有在你将大量图像层绘制到屏幕时才真正重要。
除此之外,请确保启用了双缓冲,以便在您仍在绘制下一张图像时,绘图不会尝试绘制到实际屏幕。
答案 1 :(得分:0)
Seph的回答得到了考虑和实施,但并没有提高速度。显然,正在绘制的图像根本不是问题。问题是我用来调用更新方法的计时器。我正在使用Timer
类的一个实例,它似乎非常不可靠,特别是在这些小间隔时。在移除计时器并根据系统时钟调用我的更新方法后,我能够达到并维持极高的FPS。