在Unix世界中,有一种名为“tar.gz”的着名格式。
但是现在,我想开发一款游戏,随机访问文件会更有效率。如果首先存档,则会导致顺序访问。
我知道有一种名为zip或7z的替代格式,但其他格式呢?
不仅gz.tar,我想要一个小型压缩库,还可以获得归档功能。
我应该使用* .tar还是其他解决方案?
PS:我正在使用C ++。
答案 0 :(得分:0)
通常,对于计算机游戏,您需要的是一种格式,其中每个文件在组装到一个文件之前单独压缩。这是.tar.gz和.zip / .7z格式之间的关键区别,也就是说,tar-gz是一个"压缩存档"而zip / 7z是"压缩文件的档案"。实际上,两种文件格式都使用相同的压缩算法(默认情况下),并且.tar.gz文件通常较小的唯一原因是它们压缩整个存档而不是逐个文件,从而提高了整体压缩率。
AFAIK,大多数计算机游戏都使用zip格式或与其紧密匹配的自定义格式,因为它会对每个文件进行压缩。例如,Quake引擎总是(.pak,.pk3,.pk4)依赖于现成的zip格式,只有一些小的补充(比如内置的校验和,我认为)。
.tar.gz格式是通过首先创建一个将所有(未压缩的)文件放入一个.tar文件的存档来创建的。然后,使用gzip方法压缩该大型归档文件,以创建最终的.tar.gz文件。关键是要从存档中获取任何一个文件,您可以解压缩整个文件。这非常适合备份或大型传输,但根本不适合游戏引擎媒体存档。
那就是说,你可以在技术上做相反的tar-gz,即用gzip单独压缩每个文件,然后将它们放在.tar存档中。但这可能不值得额外麻烦,因为它几乎就是zip文件的所在(在"一个简单的步骤")。因此,使用现成的一体化格式(如zip)将更容易,您可以一次提取单个文件。有许多现成的库可以在zip存档中提取和操作文件,只需从libzip开始(不要与zlib混淆(对于gzip或.gz))。
在Unix世界中,有一种名为" tar.gz"的着名格式。
可能是" tar-ballz"在类Unix系统中如此受欢迎且着名的是它们保留了文件权限(我想其他元数据)。我认为zip和7z的一些实现可能会提供该功能作为格式的扩展,但大多数都没有。 tar档案的便利之处在于,无论你放在哪里,在另一端出现的都是完全一样的,所有权限和其他任何保留。 " gzip"压缩(来自zlib)在历史上一直是行业标准的压缩算法,尽管现在还有更好的压缩算法,例如.tar.lzma(或.tlz)或.tar.xz。
但其他格式呢?
还有很多其他格式。大多数情况下,压缩归档格式通常会重复使用相同的几种算法(DEFLATE,LZ77 / LZMA / LZMA2,BZIP等),而zip / 7z / rar等格式通常只是可以使用任何压缩算法的容器格式(甚至混合和匹配取决于各个文件类型)。关键是你真的找不到比zip或7z更好的东西。他们的竞争对手今天或多或少走了(比如rar?)。
我应该使用* .tar还是其他解决方案?
不,请使用zip或7z。 Tar-ball用于备份。它们针对该目的进行了优化(例如,将一个装满文件的大型文件夹转储到tar-ball中,稍后恢复,保留所有内容并进行最佳的完整归档压缩)。对于您的应用,zip或7z更合适。
答案 1 :(得分:0)
“随机”访问对.tar.gz不好,因为那是一个.tar文件,它已经被.gz压缩包装,所以为了获取.tar文件中的内容,你首先要有解压缩.tar文件。
可以使用包含.gz压缩的单个文件的.tar文件。您可以阅读.tar文件的内容表,查找/存储归档中所有文件的位置,然后根据需要进行提取。但是,您可能会发现使用您自己的格式是“更好”(例如,如果我没记错的话,tar-archive的“标题”一次只是一个文件,您可能想要一次性构建标题,在存储文件之前[这意味着至少首先枚举所有相关文件,然后形成压缩变体并用压缩形式的补偿“修补”标题]
对于游戏,一个关键因素可能是解压缩速度,因此您可能希望查看不同的库以及哪个具有最佳的解压缩速度。我在搜索比较时发现了这个: http://catchchallenger.first-world.info//wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO
您也可能关心内存使用情况,根据算法的不同,内存使用情况会有所不同。
而且我猜你的个人文件会比Linux的整个tar-ball小得多,所以你可能想用自己的数据做自己的基准测试 - 毕竟,不同压缩格式的速度确实如此,在某种程度上,取决于数据的格式。