2015-01-14 32 views
0

所以,我正在製作一款遊戲,並且遇到了問題。我需要一些方法來高效地獲取位於3D圖形中的對象。從3D圖形獲取對象的最有效方式

但問題是,他們都可以涵蓋多個值來獲得。因此,例如,值'foo'可能覆蓋x範圍400-500,y範圍10-20和z範圍30-60。

我想知道是否有更高效的方式來存儲和獲取這些然後通過將它們存儲在一個數組中並搜索它們,我不希望這樣做,因爲這些值很大。

這是爲選擇一個遊戲的生物羣系。但是,我選擇將此放在GameDev上,因爲這似乎更像是一個數據結構問題。然而,我可能是錯的,如果我真的很樂意關閉它並在那裏打開它。

有沒有其他方法可以做到這一點?

public static Tile getTile(int height, int moisture, int temperature) { 
    for(Tile tile : tileList){ 

     boolean isTile = true; 

     if(!(tile.heightMax > height && tile.heightMin < height)){ 
      isTile = false; 
     } 

     if(!(tile.temperatureMax > temperature && tile.temperatureMin < temperature)){ 
      isTile = false; 
     } 

     if(!(tile.moistureMax > moisture && tile.moistureMin < moisture)){ 
      isTile = false; 
     } 

     if(isTile){ 
      return tile; 
     } 
    } 
} 

這是我的搜索方法。正如你所看到的,我使用一個列表來存儲所有的圖塊,並搜索符合條件的圖塊。有沒有其他的方法可以儘可能快地用很多瓷磚來做到這一點?

+0

哈希表非常擅長提供對象的快速查找,但是我對數據的結構有點遺憾,真的可以說這是一個可行的解決方案。你有什麼嘗試? –

+0

執行不明確;當你說「只需將它們存儲在數組中」時,你如何存儲它們?顯示如何存儲值的代碼片段可以幫助用戶更好地回答問題。 –

+0

我試過使用數組來存儲和查找。這是爲地圖選擇生物羣系,而每個生物羣落具有高度,溫度和溼度水平。我希望地形的生成儘可能快,所以我需要一些方法來使生物羣落快速達到給定的高度,溫度和溼度。如果您需要更多信息,請詢問。我不擅長給你們可能需要的東西,對此感到抱歉。 – chbachman

回答

0

我過去解決過這個問題的方法是定義代表3D空間區域的區域,然後將地圖存儲到來自所有區域的每個對象的空間重疊區域。然後,當您想要在某個位置查找對象時,首先使用該映射查找與該位置區域重疊的所有對象,然後再遍歷該對象以在該位置查找對象。

讓我給你一個代碼視圖。要建立本地區的地圖:

Map<Region, List<Item>> regionMap = new TreeMap<>(); 

當添加一個項目:

if (regionMap.containsKey(location.getRegion()) { 
    regionMap.get(location.getRegion()).stream() 
     .filter(item -> item.contains(location)) 
     .... 
} 

有一定的開銷:

item.getOverlappingRegions().forEach(region -> { 
    if (!regionMap.containsKey(region)) 
     regionMap.put(region, new ArrayList<>()); 
    regionMap.get(region).add(item) 
}); 

然後,當你在一個位置搜索項目這個,但是搜索你的區域是否足夠小是非常快的。

這是專爲3D空間而設計的,但它可以擴展到任意多個維度:它全部用於執行RegionLocation類。

相關問題