问题:我正在尝试为我的地图类存储切片数据。我想到了每层使用一个调色板,调色板会描述图层中的数据,这些数据是一个字节数组,每个字节代表一个图块类型。
这意味着1层1亿个瓷砖将等于~96mb。但是我忽略了我可以在一个字节中存储多少数据,结果我当然只能存储256个图块。导致256 *瓦片大小纹理大小的平方根(在这种情况下为256,因为瓦片大小为16)。 256 * 256纹理尺寸太小,因为每个调色板只能有一个纹理。严重限制我可以在一层中的瓷砖。
我现在卡在一个绑定中,好像我使用2个字节(短)而不是1个字节来存储切片数据我会将我的内存使用量加倍到每层~192mb。我想要最少4层。将最终产品充气至768mb的柱塞使用。我也无法描述数据中的数据,因为每个字节的数组偏移量也是其位置的描述。
有没有办法可以更有效地存储这些数据。最糟糕的情况将涉及我将所有这些保存到磁盘并从磁盘缓冲到内存。但我宁愿把它留在记忆中。
我想我可以在几个小时内拿出一些聪明的东西,但我想我会问是否有任何常见的方法我不知道要解决这个问题。
答案 0 :(得分:1)
我建议使用空间填充曲线(例如Hilbert curve)将数据表示在一个映射到二维平面的数组中。
然后,使用Huffman coding和run-length encoding的组合来压缩它。如果您经常在本地重复数据(即有许多部分都是彼此相邻的相同图块),这将特别有效。
在256块瓷砖的块中进行压缩。然后,有一个偏移数组,指示压缩数据到某个字节数的距离。
例如,第二个块(tile 256)字节的开头可能位于第103位,第三个块(tile 512)的开头可能位于第192个位置。
然后说要访问第400个区块,你可以解决这个问题来自第二个区块,因此解压缩第二个区块(在这种情况下是从字节103到字节191)并从中得到400 - 256 = 144区块。暂时保存(缓存)此解压缩数据,如果您获得附近的磁贴,它们也可能位于此解压缩块中。也许在您的偏移数组中,您还应该包括最近缓存的块以及它们在缓存中的位置。
如果您想允许修改,您可能必须将数据结构从一个大型数组更改为向量向量。为每个向量指定是否压缩。在进行修改时,解压缩块并修改它们,并在内存不足时重新压缩块最近最少修改的块。
或者,您可以将整个结构转储到文件并memory map文件。这更简单,但可能会更慢,具体取决于数据的可压缩性以及由于额外的I / O而导致的访问模式。