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
- 硬盘驱动器
- 公羊
约翰·卡马克(John Karmack)在2011年QuakeCon大会上发表了一篇主题演讲,他解释了整个过程,可能比我在一篇博文中的解释要好一点(除了其他一些很棒的东西),你可以找到它我不知道“资产”在这里的具体含义,但如果你有很多单独的压缩文件,你可以尝试按需解压缩+一些缓存。因此,一个文件只有在需要时才在内存中解压缩,然后缓存,如果一段时间内不需要,则在其他文件需要解压缩时从缓存中丢弃,以防止缓存变得过大。所谓资产,我指的是游戏所需的文件,像图像、网格、材质、着色器之类的东西“游戏编码完成”与satuon描述的方法差不多。好吧,让我们说纹理。我之所以这么说是因为我以前使用过的引擎似乎将几乎所有内容压缩到一个或两个文件中,它们在运行时使用这些文件。我想你应该看到: