目前我有这个代码,我的游戏要么在生成(超过一个GB)时使用更多的内存,要么我把它设置得很低,它就会给出一个
WORLD_SIZE_X & WORLD_SIZE_Z = 256;
WORLD_SIZE_Y =12 8;
有谁知道我如何改进这个,这样它就不用那么多内存了吗?
谢谢!:)
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;
}发布于 2016-03-08 02:06:18
因为你只给了一小块代码,我可以给你两个建议:
发布于 2016-03-08 00:48:00
延迟对象创建,直到您真正需要访问这些体素之一。您可以编写一个方法(我假设块是所有块类的公共子类):
Block getBlockAt( int x, int y, int z )使用类似于您在三重循环中的代码,并使用散列映射Map<Integer,Block>来存储随机内容,例如树: from x、y和z计算整数(x*128 + y)*256 + z并将其用作键。
此外,考虑到所有的“空气”,“日志”,“污垢”块,你可能不需要一个单独的对象,除非某些东西必须改变在某个块。在此之前,共享一种单一的对象。
发布于 2016-03-08 02:20:20
你确定这个方法有问题吗?除非块对象很大,否则256*256*128 ~= 8M对象不需要1GB.
尽管如此,如果块不保持状态,则使用枚举(甚至一个字节)将更有效,因为每个块不需要单独的对象:
enum Block {
air, grass, dirt, log, unbreakable;
}
Block[][][] map = ...https://stackoverflow.com/questions/35856655
复制相似问题