Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 游戏引擎运行时解压缩_C++_Compression - Fatal编程技术网

C++ 游戏引擎运行时解压缩

C++ 游戏引擎运行时解压缩,c++,compression,C++,Compression,我一直在试图找出游戏引擎是如何处理资产压缩的。显然,他们在构建游戏时压缩了所有资产。但它们如何在运行时解压呢。我能想到的唯一一件事就是将其解压缩到内存中,但那一定是非常占用内存的。如果他们解压到硬盘上,游戏玩的时候文件夹会被填满吗?这听起来不是很有效 使用一个像ZLIB(或其他任何)的C++库,这个运行时的解压缩是如何完成的? 大卫 游戏引擎处理资产压缩 有不同的游戏引擎资源,如几何模型(三角剖分/多边形模型)、纹理等。每个资源类都有不同的压缩策略。你能说得更具体些吗 对于模型压缩,压缩可以在许

我一直在试图找出游戏引擎是如何处理资产压缩的。显然,他们在构建游戏时压缩了所有资产。但它们如何在运行时解压呢。我能想到的唯一一件事就是将其解压缩到内存中,但那一定是非常占用内存的。如果他们解压到硬盘上,游戏玩的时候文件夹会被填满吗?这听起来不是很有效

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

大卫

游戏引擎处理资产压缩

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


对于模型压缩,

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

基本上,在顶层,所有资产都会/可能被压缩到大容量归档中(这加快了读取速度,因为从HDD读取的数据较少,但您为此牺牲了处理能力,就像使用DMA读取未压缩文件一样,根本不使用CPU),回读几乎总是在内存之间完成,回读HDD会破坏性能并导致大量问题(在某些情况下是不可能的,例如在旧一代控制台上)

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

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

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

一般来说,您希望使用归档文件的内存映射文件并直接解压缩到RAM,AAA归档系统的一个很好的例子是(暴雪娱乐使用,更多详细信息),它使用各种压缩算法,例如Deblo I的deflate,魔兽III的zlib,魔兽世界中的bzip2,他们最近为新游戏(如SCII)添加了LZ和稀疏压缩


Jan Wassenberg的论文(
通过排序和缓存优化文件访问
)对文件管理进行了很好的分解,这可能也很有趣。

有点像这样,你的游戏中有太多的数据,无法在合理的内存量下运行,因此你无法在内存中一次加载所有数据,因此,可以为用作缓存的数据定义一些缓冲区

现在,按照从最低到最高的速度顺序,内存如下所示:

  • DVD
  • 硬盘驱动器
  • 公羊
理想情况下,您不必从DVD流式传输数据,但如果您必须制作一个控制台游戏,则需要考虑这一点。因此,对于这些可用存储空间中的每一个,您都定义了一个用作缓存的缓冲区

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

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


约翰·卡马克(John Karmack)在2011年QuakeCon大会上发表了一篇主题演讲,他解释了整个过程,可能比我在一篇博文中的解释要好一点(除了其他一些很棒的东西),你可以找到它

我不知道“资产”在这里的具体含义,但如果你有很多单独的压缩文件,你可以尝试按需解压缩+一些缓存。因此,一个文件只有在需要时才在内存中解压缩,然后缓存,如果一段时间内不需要,则在其他文件需要解压缩时从缓存中丢弃,以防止缓存变得过大。所谓资产,我指的是游戏所需的文件,像图像、网格、材质、着色器之类的东西“游戏编码完成”与satuon描述的方法差不多。好吧,让我们说纹理。我之所以这么说是因为我以前使用过的引擎似乎将几乎所有内容压缩到一个或两个文件中,它们在运行时使用这些文件。我想你应该看到: