Java中的低FPS

Java中的低FPS,java,performance,frame-rate,Java,Performance,Frame Rate,你好,我叫Ryan,目前正在开发自己的2D java游戏。目前,游戏世界中有很多对象。在游戏的新开始时,通过使用arraylist和tree类,世界上随机放置了100棵树。我的游戏使用一个名为checkcollisions的类来检查玩家是否与任何树相交。然后将此方法放入update方法中。当这个方法没有被调用时,我得到了额外的100fps,还有没有我仍然可以得到这个100fps,但仍然检查碰撞?我真的需要一个FPS的提升,因为我的游戏目前运行在30-50 FPS 以下是检查代码: public

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

以下是检查代码:

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;
        }
    }
}
public void checkCollisions(){
对于(int i=0;i如果(放置对象。小树。获取(i).health仅检查与玩家附近的树或当前可见矩形内的树的冲突。要有效执行此操作,请保留可见的对象数组并仅在这些对象上迭代。

仅检查与玩家附近的树或当前可见矩形内的树的冲突角度。要有效地执行此操作,请保留一组可见的对象,并仅在这些对象上进行迭代。

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

两个简单但高效的2d结构是or a


可以找到与java中kd树实现的链接相关的问题。

使用空间数据结构进行冲突测试。使用这种结构,可以大量减少测试数量

两个简单但高效的2d结构是or a


可以找到一个与java中kd树实现的链接相关的问题。

不要在Swing事件调度线程中检查冲突。创建一个执行此操作的并发线程,事件线程只将它们分配给它。通过最大限度地只检查屏幕上的树来减少检查的冲突量。

不要检查冲突在Swing事件调度线程中创建一个并发线程,然后事件线程简单地将它们分配给它。通过对屏幕上的树进行最大限度的检查来减少检查的冲突量。

正如Wilbert提到的,kd树将是完美的解决方案。 对于包含大量非移动对象的简单2d游戏,您可以尝试一种更简单的方法:

首先,按照已经完成的步骤设置所有树:

把这些树都放在你的列表里

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

HashMap<Rectangle, ArrayList<Tree>> fieldSperation;
HashMap字段解析;

树中的白色数字表示它们相交的矩形。一棵树可能与多个矩形相交。然后必须在两个或多个列表中保留引用(例如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
             }
         }
     }
}
public void checkCollisions(){
//1.检查哪个矩形与播放器相交(最多4个)
对于(矩形r:fieldseparation.keySet()){
如果(playerRect.intersect(r)){
//2.与这些树相交的树进行碰撞检测
//从1开始与矩形相交的树。)
for(列表ts:fieldseparation.get(r)){
//你的旧代码在这里
}
}
}
}

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

正如Wilbert提到的,kd树将是完美的解决方案。 对于包含大量非移动对象的简单2d游戏,您可以尝试一种更简单的方法:

首先,按照已经完成的步骤设置所有树:

把这些树都放在你的列表里

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

HashMap<Rectangle, ArrayList<Tree>> fieldSperation;
HashMap字段解析;

树中的白色数字表示它们相交的矩形。一棵树可能与多个矩形相交。然后必须在两个或多个列表中保留引用(例如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
             }
         }
     }
}
public void checkCollisions(){
//1.检查哪个矩形与播放器相交(最多4个)
对于(矩形r:fieldseparation.keySet()){
如果(playerRect.intersect(r)){
//2.与这些树相交的树进行碰撞检测
//从1开始与矩形相交的树。)
for(列表ts:fieldseparation.get(r)){
//你的旧代码在这里
}
}
}
}

我非常确信这项技术将足以满足您的性能要求。

我刚刚重新整理了代码,现在工作正常!感谢所有帮助过您的人,我也很抱歉多次发布此问题……我是新手,不知道我在做什么。再次感谢您在ne中帮助过开发人员的所有人ed!这是新代码:

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;
        }
    }
for(int i=0;i