2016-03-08 52 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 = ...