我应该使用 .tar.gz 吗?

Should I use .tar.gz?

在Unix世界中,有一种著名的格式叫做"tar.gz"。

但是现在,我想开发一个游戏,随机访问一个文件会更有效率。如果先归档,会造成顺序访问。

我知道有一种称为 zip 或 7z 的替代格式,但其他格式呢?

不仅gz.tar,我还想要一个小型压缩库并获得归档功能。

我应该使用*.tar还是其他解决方案?

PS: 我正在使用 C++。

通常,对于电脑游戏,您需要的是一种格式,其中每个文件在被组合成一个文件之前被单独压缩。这是 .tar.gz 和 .zip / .7z 格式之间的关键区别,即 tar-gz 是 "compressed archive" 而 zip / 7z 是 "archives of compressed files"。事实上,这两种文件格式都使用相同的压缩算法(默认情况下),.tar.gz 文件通常较小的唯一原因是它们压缩整个存档而不是逐个文件,这增加了整体压缩率。

据我所知,大多数电脑游戏都使用 zip 格式或与之非常匹配的自定义格式,因为它会按文件压缩。例如,Quake 引擎一直(.pak、.pk3、.pk4)依赖于现成的 zip 格式和一些小的添加(我认为像内置校验和)。

.tar.gz 格式是通过首先制作一个将所有(未压缩的)文件放入一个 .tar 文件的存档来创建的。然后,使用 gzip 方法压缩那个大存档文件以创建最终的 .tar.gz 文件。关键是要从存档中获取任何一个文件,您必须解压缩整个文件。这非常适合备份或大型传输,但根本不适合游戏引擎媒体存档。

也就是说,从技术上讲,您可以执行 tar-gz 的反向操作,即使用 gzip 单独压缩每个文件,然后将它们放在一个 .tar 存档中。但这可能不值得额外麻烦,因为它几乎就是 zip 文件(在 "one easy step" 中)。因此,使用现成的一体式格式(如 zip)会容易得多,它允许您一次提取单个文件。有许多现成的库用于提取和操作 zip 存档中的文件,只有 start 和 libzip(不要与 zlib(用于 gzip 或 .gz)混淆)。

In the Unix world, there is a famous format called "tar.gz".

"tar-ballz" 在类 Unix 系统中如此流行和广泛使用的最大原因可能是它们保留了文件权限(我猜是其他元数据)。我认为 zip 和 7z 的某些实现可能会提供该功能作为格式的扩展,但大多数都没有。 tar 存档的便利之处在于,无论您放入其中的什么内容,在另一端都完全相同,并保留所有权限和其他内容。 "gzip" 压缩(来自 zlib)在历史上只是一种行业标准压缩算法,尽管现在有更好的压缩算法,也受到 tar 的支持,例如 .tar.lzma(或 .tlz) 或 .tar.xz.

but what about other formats?

实际上并没有那么多其他格式。大多数情况下,压缩存档格式通常会重复使用相同的少数算法(DEFLATE、LZ77 / LZMA / LZMA2、BZIP 等),而且通常,像 zip / 7z / rar 这样的格式只是可以使用任何这些压缩算法的真正容器格式(甚至根据各个文件类型进行混合和匹配)。关键是您真的找不到比 zip 或 7z 更好的东西了。他们的竞争对手今天或多或少已经消失了(比如 rar?)。

Should I use *.tar or other solutions are available?

不,使用 zip 或 7z。 Tar-球用于备份。它们为此目的进行了优化(例如,将一个装满文件的大文件夹转储到一个 tar-ball 中,并在以后恢复它,保留所有内容并进行最佳全存档压缩)。对于您的应用程序,zip 或 7z 更合适。

"Random" 无法在 .tar.gz 上访问,因为那是一个 .tar 文件,已被 .gz 压缩,因此要访问.tar 文件,您首先必须解压缩 .tar 文件。

可以使用包含用 .gz 压缩的单个文件的 .tar 文件。您可以阅读 .tar 文件的内容 table 和所有文件都在存档中的 find/store ,然后根据需要提取。但是,您可能会发现使用自己的格式是 "better"(例如,如果我没记错的话,"header" for a tar-archive 一次是一个文件,您可能想要构建你的 header 集中在一起,在你存储文件之前 [这意味着至少首先枚举所有相关文件,然后形成压缩变体和 "patching up" header 压缩中的偏移量形式]

对于一款游戏来说,一个关键因素可能是解压速度,所以你可能想看看不同的库,看看哪个库的解压速度最好。我在搜索比较时发现了这个: http://catchchallenger.first-world.info//wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO

您可能还关心内存使用情况,这也会因算法而有所不同。

而且我猜你的个人文件会比 Linux 的整个 tar-ball 小得多,所以你可能想用你自己的数据做你自己的基准测试 - 毕竟,不同压缩格式的速度在某种程度上取决于数据的格式。