我的Java游戏与fps斗争

您好,我的名字是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; } } } 

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

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

广泛的阶段

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

空间划分

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

这些概念如下图所示

在此处输入图像描述

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