首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA -内存不足- Voxel世界世代

JAVA -内存不足- Voxel世界世代
EN

Stack Overflow用户
提问于 2016-03-08 00:14:11
回答 3查看 64关注 0票数 0

目前我有这个代码,我的游戏要么在生成(超过一个GB)时使用更多的内存,要么我把它设置得很低,它就会给出一个

WORLD_SIZE_X & WORLD_SIZE_Z = 256;

WORLD_SIZE_Y =12 8;

有谁知道我如何改进这个,这样它就不用那么多内存了吗?

谢谢!:)

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-08 02:06:18

因为你只给了一小块代码,我可以给你两个建议:

  1. 压缩对象的大小。看起来很蠢但很容易做。想象一下你的记忆中有成千上万的东西。如果每个人都可以压缩一半大小,你可以节省一半的内存:)。
  2. 需要时,只需将值赋值给数组即可。有时候,如果你真的需要一个指定的数组,它就不工作了。因此,只要尽可能少地为数组中的元素赋值即可。如果你能给我看更多的代码,我可以帮你更多。
票数 0
EN

Stack Overflow用户

发布于 2016-03-08 00:48:00

延迟对象创建,直到您真正需要访问这些体素之一。您可以编写一个方法(我假设块是所有块类的公共子类):

代码语言:javascript
复制
Block getBlockAt( int x, int y, int z )

使用类似于您在三重循环中的代码,并使用散列映射Map<Integer,Block>来存储随机内容,例如树: from x、y和z计算整数(x*128 + y)*256 + z并将其用作键。

此外,考虑到所有的“空气”,“日志”,“污垢”块,你可能不需要一个单独的对象,除非某些东西必须改变在某个块。在此之前,共享一种单一的对象。

票数 1
EN

Stack Overflow用户

发布于 2016-03-08 02:20:20

你确定这个方法有问题吗?除非块对象很大,否则256*256*128 ~= 8M对象不需要1GB.

尽管如此,如果块不保持状态,则使用枚举(甚至一个字节)将更有效,因为每个块不需要单独的对象:

代码语言:javascript
复制
enum Block {
    air, grass, dirt, log, unbreakable;
}

Block[][][] map = ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35856655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档