c++ 使用数组减少内存
Posted
技术标签:
【中文标题】c++ 使用数组减少内存【英文标题】:c++ Memory reduction with arrays 【发布时间】:2014-11-07 18:51:31 【问题描述】:我正在创建一个基于块的游戏,我想改进它的内存使用。
我目前正在使用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 或指向其他东西,所以我应该怎么做?
【问题讨论】:
1.为什么这里的内存使用是个问题? 2. 指针通常为 4 字节(在 32 位平台上)或 8 字节(在 64 位平台上)。添加指针会使您的内存使用更糟,而不是更好。为什么不只分配一个大块并摆脱指针? 一个指针占用8位内存,你是说64位系统8字节内存? @Duckdoom5:不,不完全是。您在这里有三个级别的分配。在两个级别上,它们是指针数组。 @LightnessRacesinOrbit 啊,我明白了,所以如果我使用:Block m_pBlocks[32][64][32]
会删除指针?
@Duckdoom5:并且你不必在循环中搞乱new[]
和delete[]
。 :)
【参考方案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 字节的指针并不是真正的保存。
但是有几种方法可以帮助节省更多,如果您有一个高度图,那么高度图上方的所有东西都是空气!所以你只需要一个二维数组来检查,其中元素是高度。高度图下方的所有空气体素必须与其他非空气元素一起定义。
其他数据结构通常更节省空间,例如 Octree 或 Sparse voxel octree。
【讨论】:
【参考方案2】:如果您不需要修改这些块,您可以创建一个查找图。 请不要使用 new,并尽可能避免使用指针。
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;
现在您可以查询查找表以查看您是否有特定的块集。 此外,您现在将所有这些值放在一起,这对性能很有好处。
【讨论】:
以上是关于c++ 使用数组减少内存的主要内容,如果未能解决你的问题,请参考以下文章