6

大多数游戏都将其资源(模型、纹理等)打包到特殊文件中(例如 Quake 3 中的 .pk3 文件)。显然,这些文件以某种方式被“挂载”并被用作单独的文件系统。

我想知道这是如何实现的。到目前为止,我想出的唯一策略是将偏移大小信息放在文件头中,然后对文件进行内存映射并访问资源,就好像它们是独立的受写保护的内存块一样。

我想知道我的策略是否可行以及是否有更好的选择。

谢谢!

4

3 回答 3

3

你的策略很合理;事实上,它与文件系统驱动程序对原始块设备所做的操作完全类似。您对该实施有什么问题?

于 2011-03-28T18:16:45.197 回答
3

你的方法听起来很合理。基本上,您将拥有一个带有(可选)元数据的 ISAM 文件。您可以根据标准(内容类型、使用频率、使用地点等)将文件分成多个部分(“目录”),并为每个部分提供单独的索引/目录。如果您允许一个部分作为内容类型,那么您可以嵌套它们并以一致的方式处理它们。

如果您的要求相当基本,您可以考虑简单地使用 zip/tar 文件作为容器。无论如何,查看这些代码可能是一个不错的起点。

于 2011-03-28T18:43:59.227 回答
3

我不能说 Quake3 的确切格式,但有几种方法可以满足您的需求:

  1. 存档文件(ZIP、Tar 等)
  2. 不同种类的复合存储。在 Windows 上有 Microsoft 结构化存储
  3. 嵌入式单文件数据库
  4. 虚拟文件系统,它实现了一个实际的文件系统,但不是存储在磁盘分区上,而是存储在其他地方(资源、内存等)。

这些方法中的每一种都有它自己的长处和短处

我们的SolFS产品就是上面提到的虚拟文件系统的一个例子。它专为与您类似的任务而设计。

档案和一些复合文件的实现通常具有线性顺序结构 - 文件一个一个地写入,文件的开头或结尾有一些目录。

一些复合文件实现、数据库和虚拟文件系统具有基于页面的结构(“页面”类似于 FAT 或 NTFS 中的扇区或簇),其中文件可以分散在存储中。

于 2011-03-28T18:59:16.527 回答