我的Java游戏与fps斗争

时间:2013-10-30 13:34:04

标签: java frame-rate

您好我的名字是Ryan,我正在开发自己的2D Java游戏。目前游戏世界中有很多对象。在游戏重新开始时,世界上随机放置了100个发辫,使用了一个arraylist和一个树类。我的游戏使用一个名为checkcollisions的类来检查玩家是否与任何发辫交叉。然后将此方法置于update方法中。当没有调用此方法时,我得到额外的100 FPS,我仍然可以得到这100 fps,但仍然检查是否有碰撞?我真的需要FPS提升,因为我的游戏目前以30-50 fps运行

这里是checkcollisions代码:

public void checkCollisions() {
    for (int i = 0; i < Placing_Objects.Small_Trees.size(); i++) {
        if (player.getBounds().intersects(Placing_Objects.getSmall_Tree().get(i).getBounds())) {
            if (gotAxeOn) {Placing_Objects.Small_Trees.get(i).health -= rand.nextInt(3);}
        }
        if (Placing_Objects.Small_Trees.get(i).health <= 0) {
            Placing_Objects.removeSmall_Tree(Placing_Objects.Small_Trees.get(i));
            Inventory.addItemToInv("Wood");
            Inventory.addItemToInv("Wood");
            Inventory.addItemToInv("Stick");
            Player.exp += rand.nextInt(3);
            challenges.choppedDownTrees += 1;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

100个对象应该能够轻松支持100fps的碰撞检查,尤其是在2D世界中。因此,您的算法可能有问题。

听起来你强力检查每棵树对着玩家;这可能变得非常慢,特别是如果树的几何形状复杂。通过使用一个或多个广泛阶段,可以避免这种级别的检查。

广泛阶段

在基本的广泛阶段中,检查每个可能碰撞边界框的对象与其他对象的边界框。边界框恰好是对象的形状并不重要,只是它相对较小,完全包含对象并且是一个简单的形状(轴对齐的矩形是最好的)。只有通过这种简单的碰撞检查才能进行更为昂贵的窄阶段检查。

空间分区

进一步的改进是将该区域空间分隔成更大的盒子。从而允许您一次消除与几棵树的碰撞。

这些概念如下图所示

enter image description here

此处播放器显示为红色圆圈;您可以立即看到除了两棵树之外没有任何点检查,因为只有2棵树在与播放器相同的大盒子内。在检查这两棵树的边界框时,你会看到其中只有一棵可能与玩家发生碰撞;你检查剩下的树的精细几何,发现它也不会碰撞。