Java中的低FPS

时间:2013-10-30 17:03:09

标签: java performance 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;
        }
    }
}

5 个答案:

答案 0 :(得分:3)

仅检查与播放器附近的树木或当前可见矩形内的树木的碰撞。要有效地执行此操作,请保留一组可见的对象,并仅对这些对象进行迭代。

答案 1 :(得分:2)

正如威尔伯特所说,kd树将是完美的解决方案。 对于具有大量非移动物体的简单2D游戏,您可以尝试更简单的方法:

首先,按照您已经完成的方式设置所有树木:

enter image description here

将所有这些树保存在ArrayList中。

不要在相同大小的x矩形中分隔你的游戏区域(例如3x5 = 15)并检查哪个树与哪个区域相交。将这些计算保存在合适的数据结构中。例如:

HashMap<Rectangle, ArrayList<Tree>> fieldSperation;

enter image description here

树上的白色数字表示它们相交的矩形。一棵树可能与多个Rectangle相交。然后你必须在两个或多个列表中持有一个引用(例如6/7或7/12)。

最后,您可以按如下方式调整checkCollisions()方法:

public void checkCollisions() {
    // 1. check which Rectangle intersects with the player (can be a maximum of 4)
    for (Rectangle r : fieldSeperation.keySet()) {
         if (playerRect.intersect(r)) {
             // 2. do your collision detection with those trees which are intersecting with those
             // trees which are intersecting with the rectangles from 1.)
             for (List<Tree> ts : fieldSeperation.get(r)) {
                 // your old code here
             }
         }
     }
}

我很确定这种技术足以满足您的性能要求。

答案 2 :(得分:1)

使用空间数据结构进行碰撞测试。使用这种结构,您可以大量减少测试次数。

2d的两个简单而有效的结构是quadtreekd-tree

可以找到一个相关问题,其中包含指向java中kd-tree实现的链接here

答案 3 :(得分:0)

不要在Swing事件派发线程中检查冲突。创建一个并发线程来执行该操作,并且事件线程只是将它们分配给它。通过最多只检查屏幕上的树来减少检查的碰撞量。

答案 4 :(得分:0)

我刚刚重新安排了代码,它现在运行正常!感谢所有帮助过的人,我也很抱歉多次发布这个问题......我是新手,并不知道我在做什么。再次感谢大家帮助了有需要的开发人员!这是新代码:

for (int i = 0; i < Placing_Objects.Small_Trees.size(); i++) {
        if (gotAxeOn) {
            if (player.getBounds().intersects(Placing_Objects.getSmall_Tree().get(i).getBounds())) {
                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;
        }
    }