簡體   English   中英

Java更好的存儲過程信息的方法

[英]Java better way to store procedural Information

我想知道如何優化存儲過程信息和訪問數據列表中的特定元素。

例如,當我在我的世界中創建植被時,我告訴我的系統從0開始,一個10行的線,然后它回到0並增加z位置以創建另一條線。

通過在ArrayLists中存儲位置,旋轉,紋理和模型等數據來跟蹤任何對象,以便在需要時在其他位置訪問它們,例如在碰撞檢測中:

public void collision_ForestTree001() { 
    int modelID = 0;

    while(treeXArray.size() != modelID && treeZArray.size() != modelID) {

// player and object bounds
        float playerX = 0.15f;
        float playerZ = 0.15f;

        float objectX = 0.2f;
        float objectZ = 0.2f;

// collision check

        if((PlayerX)+playerX < treeXArray.get(modelID)-objectX ||
                (PlayerX)-playerX > treeXArray.get(modelID)+objectX) {
            collisionX = false;
            } else {                
                collisionX = true;  
            }

        if((PlayerZ)+playerZ < treeZArray.get(modelID)-objectZ ||
                (PlayerZ)-playerZ > treeZArray.get(modelID)+objectZ) {
            collisionZ = false;
            } else {
                collisionZ = true;  
            }

        modelID++;
    }
}

我想知道是否有更好的存儲和訪問數據的方式,因為使用ArrayLists訪問信息似乎有點愚蠢,因為我必須逐個瀏覽元素才能找到所需的數據..感謝您的幫助!

如果每個森林的行為都是獨立的,那么您的解決方案似乎並不那么糟糕。 如果要優化CPU並減少列表的迭代次數,可以使用一些與屏幕區域和林相關聯的映射。 因此,根據玩家的位置,您將僅檢查屏幕區域中與森林的碰撞。

編輯子問題:

別客氣。 我也喜歡游戲編程。 請享用 :)

正如我在最初的消息中所說,如果每棵樹的行為都是獨立的,那么這是一個很好的方法。 獨立的意思是當你的玩家接觸到一棵樹時,這棵樹必須通過做一些小動作做出反應,你沒有選擇:你必須檢查玩家所在地區的每棵樹才能做出反應對於被觸摸的樹。

但是,如果當您的玩家觸摸到一棵樹時,樹沒有反應,只有玩家做出反應(例如通過阻止他),您可以將碰撞檢測分解。 因此,您可以考慮不應在用戶所在的區域計算碰撞,而應在樹木所在的整個區域進行計算。 因此,您可以使用一個或多個矩形來覆蓋樹碰撞檢測,並且您不必強制迭代列表。

為了存儲這樣的數據,我建議你創建一個類來表示將存儲所有數據的每個植被對象。 該對象稱為實體。

public class Entity {

    private double xCord;
    private double yCord;
    private double zCord;

    //or in opengl you can use Vector3f() depending on your library

    private double rotX;
    private double rotY;
    private double rotZ;

    private Texture texture;

    //assuming your model is represented by a class object
    private Model model;

    public Entity(double xC, double yC, double zC, double rX,
         double rY, double rZ, Texture t, Model m) {

        xCord = xC;
        yCord = yC;
        zCord = zC;
        rotX = rX;
        rotY = rY;
        rotZ = rZ;
        texture = t;
        model = m;
    }

    public double getX(){
        return xCord;
    }

    public double getY(){
        return yCord;
    }

    public double getZ(){
        return zCord;
    }

    public double getRotX(){
        return rotX;
    }

    public double getRotY(){
        return rotY;
    }

    public double getRotZ(){
        return rotZ;
    }

    public Texture getTexture(){
        return texture;
   }

    public Model getModel(){
        return model;
    }

}

然后,您可以將所有實體存儲在一個arraylist中,您將遍歷它以呈現每個實體。 此外,您可以添加mutator方法來編輯實體,例如更改旋轉或位置。 同樣為了獲得最大效率,您可以使用距離公式來確定哪些實體處於渲染距離,並僅渲染和測試碰撞的實體。 這可以加快程序的速度,因為渲染是幾乎所有程序中最重的任務。

既然你問的是如何做得更好,這里有幾個指針。

  1. 處理你的封裝。 我假設您每幀都調用此方法來更改collisionX和collisionZ的值(外部方法應該是不可變的)。 這是糟糕的OOP。 您應該將此方法傳遞給確定碰撞所需的參數,然后返回collisionX和collisionZ的狀態。

  2. 初始化playerX / Z,對象X / Z在while循環范圍之外。 每次循環時都不需要創建新變量。

  3. 進一步抽象你的對象。 將對象總區域的坐標存儲在Map / Hashmap中的2d平面上。

  4. 通過定義更大的不太密集的碰撞檢查來減少計算壓力。 例如,僅檢查與上面建議的屏幕區域中的對象,網格區域中的碰撞,或者如果您有復雜的對象形狀,確定包裹整個碰撞對象的最小圓圈,對您的玩家角色執行相同操作,然后進行距離檢查他們各自的圈子中心之間。 如果距離檢查返回足夠高的值,則只需跳過碰撞檢查,否則,使用更准確的碰撞檢查。

暫無
暫無

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

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