游戏引擎运行时解压缩

时间:2012-06-29 06:44:03

标签: c++ compression

我一直试图了解游戏引擎如何处理资产压缩。显然,他们在构建游戏时会压缩所有资产。但是他们如何在运行时解压缩它们。我唯一能想到的就是解压缩到内存中,但这必须是内存密集型的。如果他们解压缩到硬盘上,文件夹会在游戏正在播放时填满?这听起来效率不高。

使用像clib(或任何其他)一样的库与c ++,这个运行时解压缩是如何完成的?

大卫

3 个答案:

答案 0 :(得分:9)

有点像这样,你有一个拥有如此多数据的游戏,它不适合合理数量的内存,所以你不能在内存中一次加载所有这些,所以你为它定义一些缓冲区您用作缓存的数据。

现在记忆按照从最低到最高的速度顺序如下:

  • DVD
  • 硬盘
  • RAM

理想情况下,您不必从DVD流式传输数据,但如果您必须制作控制台游戏,则需要考虑这些因素。因此,对于每个可用存储空间,您都可以定义一个缓冲区来用作缓存。

当游戏引擎确定它可能需要资产时,它应首先查看最快的缓存以查看资产是否已加载。如果是,那么你很幸运,你可以立即发送它。如果它不在最快的缓存中,则必须降低硬盘缓存的级别。这是一个文件,您可以保存已经解压缩并准备加载到内存中的资产。如果最快的缓存没有完全占用,那么您可以开始加载数据并在它准备就绪时使用它。如果没有足够的空间,那么你必须首先卸载其他资产,我建议删除最近最少使用的资产,直到你有足够的空间来加载新资产。

现在,如果硬盘缓存没有加载数据,那么你必须再向下一级到存档,你需要使用zip格式来压缩它,因为zip文件格式不会强迫你解压缩整个存档只能访问一个文件所以你要做的就是在存档中找到所述文件的偏移量并将其解压缩到硬盘缓存中。再次,如果缓存已满,您必须首先卸载其他一些资产,我建议删除最近最少使用的资产,但如果您认为它会提高性能,您也可以尝试其他算法。

John Karmack在QuakeCon 2011上发表了一个主题演讲,他解释说整个过程可能比我在帖子中更好(其他很棒的东西),你可以找到它here

答案 1 :(得分:3)

压缩可以在许多不同的层上以多种方式发生,并且其使用的时间,地点和方式完全取决于其目标和方式。目标是(压缩并不总是关于节省磁盘空间)。

非常基本上,在顶层,所有资产都会/可能被压缩成批量存档(这会加快读取速度,因为从HDD中读取的内容较少,但是你正在牺牲处理能力,因为使用DMA读取未压缩的文件,根本不使用CPU,读回几乎总是内存到内存,读回硬盘会破坏性能并导致一系列问题(在某些情况下是不可能的) ,例如在老一代游戏机上。)

第二层可以/可以在资产本身上完成,例如,纹理可以以多种不同方式压缩,但主要是块压缩(S3TC / DXTn,BCn)这些天使用,因为它支持解压缩硬件(或由驱动程序模拟),因此一旦读取存档/磁盘,就不需要进行进一步的解压缩。

压缩策略也因平台而异,尤其是对内存布局非常敏感,资源有限且缓存较小的控制台等。

  

使用像clib(或任何其他)一样的库与c ++,这个运行时解压缩是如何完成的?

通常你想使用存档的内存映射文件并直接解压缩到RAM,这是一个很好的文档记录的AAA存档系统的一个很好的例子,这是MPQ format(由暴雪娱乐使用,更多细节here),它使用各种压缩算法,例如暗黑破坏神I,魔兽争霸III的zlib,魔兽世界的bzip2,他们最近为他们的新游戏如SCII添加了LZ和稀疏压缩。

Jan Wassenberg的论文(Optimizing File Accesses via Ordering and Caching)有很好的文件管理细分,也可能是有意义的。

答案 2 :(得分:0)

  

游戏引擎处理资产压缩

有不同的游戏引擎资产,例如几何模型(三角剖分/多边形模型),纹理等。每个资产类都有不同的压缩策略。你能更具体一点吗?

对于模型压缩,Check this