c ++使用数组减少内存

时间:2014-11-07 18:51:31

标签: c++ arrays memory-management

我正在创建一个基于块的游戏,我想改进其内存使用情况。 我目前正在使用sizeof()创建块.8。我无法减小其大小。

块:

...
bool front, back, left, right, top, bottom;//If the face is active, true

BYTE blockType;
BYTE data;

我提出了一个解决方案,但我不知道如何正确实现它,因为我对c ++很新。解决方案: 所有空气块都完全相同,但每个空气块占用8个字节的内存。如果我可以设置所有空气块,指向同一块内存,这应该(我猜)使用更少的内存。 (除非指针地址占用8个字节?)

目前我的数组如下所示:

组块:

Block*** m_pBlocks;

Chunk::Chunk()
{
    m_pBlocks = new Block**[CHUNK_SIZE];
    for(int x = 0; x < CHUNK_SIZE; x++){
        m_pBlocks[x] = new Block*[CHUNK_HEIGHT];
        for(int y = 0; y < CHUNK_HEIGHT; y++){
            m_pBlocks[x][y] = new Block[CHUNK_SIZE];
        }
    }
}

我知道你不能指出这些指向null或指向别的东西所以我应该怎么做呢?

2 个答案:

答案 0 :(得分:1)

如果您不需要修改这些块,则可以创建查找地图。 请不要使用新的,尽量避免使用指针。

bool lookup[CHUNK_SIZE][CHUNK_HEIGHT];

Chunk::Chunk()
{
    for(int x = 0; x < CHUNK_SIZE; x++)
      for(int y = 0; y < CHUNK_HEIGHT; y++)
        lookup[x][y] = true;
}

现在您可以查询查找表以查看您是否具有该特定块集。 此外,您现在可以将所有这些值放在一起,这有利于提高性能。

答案 1 :(得分:1)

使用位域减小Block的大小。

class Block {
  // bit fields, reduce 6 bytes to 1
  unsigned char front:1, back:1, left:1, right:1, top:1, bottom:1;//If the face is active, true

  BYTE blockType;
  BYTE data;
  // optional alignment to size 4.
  // BYTE pad;
};

Block m_pBlocks[32][64][32]; // 32*64*32=64K * sizeof(Block)=256K that is a lot.

是的,使用8字节的指针并不是真正的保存。

但是有几种方法可以帮助节省更多,如果你有hightmap,那么高地图上面的一切都是空气!所以你只需要一个二维数组来检查,其中元素是高度。必须将hightmap下方的所有空气体素与其他非空气元素一起定义。

其他数据结构通常更具空间效果,如OctreeSparse voxel octree