簡體   English   中英

Java中的FPS低

[英]Low FPS in Java

您好,我叫Ryan,目前正在開發自己的2D Java游戲。 當前,游戲世界中有很多對象。 在游戲重新開始時,世界使用數組列表和樹類隨機加載了100個發束。 我的游戲使用一個稱為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;
        }
    }
}

僅檢查與玩家附近的樹木或當前可見矩形內的樹木是否發生碰撞。 為了高效地執行此操作,請保留可見的對象數組,並僅在這些對象上進行迭代。

正如威爾伯特(Wilbert)所言,kd樹將是完美的解決方案。 對於帶有很多不動對象的簡單2d游戲,您可以嘗試一種更簡單的方法:

首先,按照已經完成的步驟設置所有樹:

在此處輸入圖片說明

將所有這些樹保存在ArrayList中。

請勿將您的游戲區域分隔為相同大小的x個矩形(例如3x5 = 15),並檢查哪個樹與哪個區域相交。 將這些計算結果保存在合適的數據結構中。 例如:

HashMap<Rectangle, ArrayList<Tree>> fieldSperation;

在此處輸入圖片說明

樹木中的白色數字表示它們相交的矩形。 一棵樹可能與一個以上的矩形相交。 然后,您必須將引用保存在兩個或多個列表中(例如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
             }
         }
     }
}

我很確定該技術足以滿足您的性能要求。

使用空間數據結構進行碰撞測試。 采用這種結構,可以大量減少測試次數。

2d的兩個簡單而有效的結構是四叉樹kd-tree

可以在這里找到與Java中的kd-tree實現鏈接的相關問題。

不要在Swing事件分發線程中檢查沖突。 創建一個執行該操作的並發線程,事件線程將它們簡單地分配給它。 通過最多僅檢查屏幕上的樹來減少已檢查的沖突量。

我只是重新排列了代碼,現在可以正常工作了! 謝謝所有幫助過的人,我也很抱歉多次發布此問題...我是新來的,我真的不知道我在做什么。 再次感謝大家為需要幫助的開發人員提供幫助! 這是新的代碼:

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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM