C++ 每层存储超过1亿个磁贴的磁贴数据多层

C++ 每层存储超过1亿个磁贴的磁贴数据多层,c++,c++11,C++,C++11,问题:我正在尝试为我的map类存储平铺数据。我的想法是每层使用一个调色板,调色板将描述层中的数据,这将是一个字节数组,每个字节代表一种平铺类型 这意味着一层1亿块瓷砖相当于96mb。然而,我忽略了一个字节可以存储多少数据,结果我只能存储256个分片。产生256*瓷砖大小纹理大小的平方根(在本例中,瓷砖大小为16时为256)。256*256纹理大小太小,因为每个调色板只能有一个纹理。严重限制了我可以在一层中使用的瓷砖 我现在陷入了一个绑定中,好像我使用2个字节(短)而不是1个字节来存储磁贴数据,我

问题:我正在尝试为我的map类存储平铺数据。我的想法是每层使用一个调色板,调色板将描述层中的数据,这将是一个字节数组,每个字节代表一种平铺类型

这意味着一层1亿块瓷砖相当于96mb。然而,我忽略了一个字节可以存储多少数据,结果我只能存储256个分片。产生256*瓷砖大小纹理大小的平方根(在本例中,瓷砖大小为16时为256)。256*256纹理大小太小,因为每个调色板只能有一个纹理。严重限制了我可以在一层中使用的瓷砖

我现在陷入了一个绑定中,好像我使用2个字节(短)而不是1个字节来存储磁贴数据,我将加倍我的内存使用量,达到每层约192mb。我至少要4层。将最终产品充气至使用的768mb ram。我也不能在数据中描述数据,因为每个字节的数组偏移量也是对其位置的描述

有没有一种方法可以更有效地存储这些数据。最坏的情况是我将所有这些保存到磁盘,并从磁盘缓冲到内存。但我宁愿把它留在记忆中


我想我可以在几个小时内想出一些聪明的方法,但我想我会问一下,是否有我不知道的常用方法来解决这个问题。

我建议用数组来表示数据,该数组使用空间填充曲线映射到二维平面,如

然后,使用和的组合来压缩它。如果您的数据经常在本地重复(即,有许多分区彼此相邻,它们都是相同的块),这将特别有效

在256块的块中进行压缩。然后,创建一个偏移量数组,该数组指示某些字节数在压缩数据中的位置

例如,第二块(磁贴256)字节的开始可能在位置103,第三块(磁贴512)的开始可能在位置192

然后说要访问第400个磁贴,你可以计算出这是从第二个块来的,所以解压缩第二个块(在本例中是从字节103到字节191),从这里得到400-256=144个磁贴。暂时保存(缓存)此解压缩数据,如果您正在获取附近的磁贴,它们也可能位于此解压缩块中。也许在偏移量数组中还应该包括最近缓存的块以及它们在缓存中的位置

如果您想允许修改,可能必须将数据结构从一个大数组更改为向量向量。每个向量都有一个指示器,无论它是否被压缩。进行修改时,解压缩块并对其进行修改,并在内存耗尽时重新压缩最近修改最少的块



或者,您可以将整个结构转储到一个文件和一个文件中。这要简单得多,但速度可能较慢,这取决于数据的可压缩性以及由于额外的I/O而导致的访问模式。

这是一种可以用钱包解决的问题。购买更多的内存我想我是在想一个有1gb内存需求的2d游戏并没有那么糟糕。尽管如此,我还是喜欢另一种选择。我是在开玩笑,即使它能奏效。所有1亿块瓷砖是否同时可见?否则,您可以尝试将可见部分保留在内存中,并根据需要加载其他部分。此外,是否所有位置都始终包含数据?否则,请考虑创建稀疏结构。不仅屏幕可见,因此(屏幕宽度*高度)/16,但是如果用户单击小地图,他们可以立即更改到地图中的任何点。所以它需要快速加载。是的,所有的位置都包含数据。那么数据的用途是什么呢?你打算对它做哪些操作?只是阅读并展示它?或者你会编辑它?你一次会用多少(比如几秒钟内)?