gpt4 book ai didi

c++使用数组减少内存

转载 作者:行者123 更新时间:2023-11-28 02:38:16 25 4
gpt4 key购买 nike

我正在创建一个基于 block 的游戏,我想改进它的内存使用。我目前正在使用 sizeof() 8 创建 block 。而且我无法减小它的大小。

block :

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

BYTE blockType;
BYTE data;

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

目前我的数组看起来像这样:

block :

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 或指向其他内容,所以我应该怎么做?

最佳答案

使用位域来减小块的大小。

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 字节的指针并不是真正的节省。

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

其他数据结构通常更节省空间,例如 OctreeSparse voxel octree .

关于c++使用数组减少内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com