2016-03-08 17 views
0

目前我有這個代碼和生成當我的遊戲或者使用辦法不多內存(超過GB),或者如果我將它設置低,它會給出一個JAVA - 內存不足 - 體素世界生成

WORLD_SIZE_X & WORLD_SIZE_Z = 256;

WORLD_SIZE_Y = 128;

有誰知道我怎麼能改善這個,所以它不使用這麼多的RAM?

謝謝! :)

public void generate() { 
    for(int xP = 0; xP < WORLD_SIZE_X; xP++) { 
     for(int zP = 0; zP < WORLD_SIZE_Z; zP++) { 
      for(int yP = 0; yP < WORLD_SIZE_Y; yP++) { 

       try { 
        blocks[xP][yP][zP] = new BlockAir(); 

        if(yP == 4) { 
         blocks[xP][yP][zP] = new BlockGrass(); 
        } 
        if(yP < 4) { 
         blocks[xP][yP][zP] = new BlockDirt(); 
        } 
        if(yP == 0) { 
         blocks[xP][yP][zP] = new BlockUnbreakable(); 
        } 
       } catch(Exception e) {} 
      } 


      //Tree Generation :D 
      Random rX = new Random(); 
      Random rZ = new Random(); 
      if(rX.nextInt(WORLD_SIZE_X) < WORLD_SIZE_X/6 && rZ.nextInt(WORLD_SIZE_Z) < WORLD_SIZE_Z/6) { 
       for(int j = 0; j < 5; j++) { 
        blocks[xP][5 + j][zP] = new BlockLog(); 
       } 
      } 
     } 
    } 
    generated = true; 
} 

回答

0

因爲你只是給一小段代碼,我可以給你兩個建議:

  1. 緊湊的對象大小。看起來很愚蠢但很容易做到。想象一下你的記憶中有成千上萬的物體。如果每個人都可以壓縮一半大小,你可以節省一半的內存:)。

  2. 只需在需要時將值分配給數組。有時候,如果你確實需要一個分配的數組,那麼這是行不通的。因此,只需儘可能將值分配給數組中的元素即可。如果你能給我看更多的代碼,我可以幫助你更多。

1

延遲對象創建,直到你真的需要訪問這些體素之一。你可以寫一個方法(我假設塊作爲所有塊階級的共同子類):使用類似的代碼,你在你的三重循環有

Block getBlockAt(int x, int y, int z) 

,加上使用哈希地圖Map<Integer,Block>用於存儲隨機東西,例如樹:從x,y和z計算整數(x*128 + y)*256 + z並將其用作關鍵字。

此外,考慮到對於所有「空氣」,「日誌」,「污垢」塊,您可能不需要單獨的對象,除非必須在某個塊上更改某些內容。在此之前,共享一種單一的對象。

0

你確定問題出在這個方法中嗎?除非塊對象真的很大,否則256 * 256 * 128 = 8M的對象不應該需要1 GB ...

也就是說,如果塊不保持狀態,則使用枚舉或者甚至是一個字節),因爲我們不需要每個塊的單獨對象:

enum Block { 
    air, grass, dirt, log, unbreakable; 
} 

Block[][][] map = ...