我正在创建一个基于块的游戏,我想改进其内存使用情况。
我目前正在使用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或指向别的东西所以我应该怎么做呢?
答案 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下方的所有空气体素与其他非空气元素一起定义。
其他数据结构通常更具空间效果,如Octree或Sparse voxel octree。