File io 正在从大型文本文件中读取特定字节的数据。。。迅速地

File io 正在从大型文本文件中读取特定字节的数据。。。迅速地,file-io,format,save,loading,game-engine,File Io,Format,Save,Loading,Game Engine,为了便于讨论,假设您有一个巨大的文件来保存地图保存数据。一个很好的例子就是Terraria。它们将所有MapWidth*MapHeight平铺数据保存在单个地图文件中(这真是一个可怕的想法),但它们只能根据相机位置渲染相机内可见的内容(为了平滑起见,还可以渲染一些外部平铺平铺) 所以我的问题是,“他们如何从摄像机位置开始实时搜索所有数据?” 这将需要通过读取可能数以百万计的磁贴数据来获得屏幕坐标。我知道如果磁贴数据是一致的,您可以根据x/y坐标跳过数据字节(这是我在一周左右的搜索中所能找到的),

为了便于讨论,假设您有一个巨大的文件来保存地图保存数据。一个很好的例子就是Terraria。它们将所有MapWidth*MapHeight平铺数据保存在单个地图文件中(这真是一个可怕的想法),但它们只能根据相机位置渲染相机内可见的内容(为了平滑起见,还可以渲染一些外部平铺平铺)

所以我的问题是,“他们如何从摄像机位置开始实时搜索所有数据?”

这将需要通过读取可能数以百万计的磁贴数据来获得屏幕坐标。我知道如果磁贴数据是一致的,您可以根据x/y坐标跳过数据字节(这是我在一周左右的搜索中所能找到的),但这就是我的问题所在。平铺数据是动态的。如果一个磁贴为空,则“isValid”之外的数据不存在。因此,要搜索的字节更少。如果瓷砖有水、多个状态、背景等。。。它包含所有数据,以字节计是最大的。所以它根本不是常数。在这种情况下,我们不能只跳过X个字节,因为它会发生变化(随着分幅的修改而不断变化)

我目前的解决方案是:逐行读取(Ugh),使用块文件,或确保固定行大小(填充?数据浪费…Ugh)


我知道区块是最好的选择,但是能够快速深入文本文件仍然是一件很好的事情。

如果你有基于区块的数据,你需要一个基于区块的阅读器,就这么简单

此外,如果您只对数据的某些部分特别感兴趣,并且可以先对其进行处理,则需要构建第二个文件/列表,以存储到第一个文件中每个对象起点的偏移量

在这种情况下,每当需要引用对象时,首先查找偏移量,然后直接跳转到原始文件中的偏移量。它仍然要求您至少读取整个文件一次