我一直试图找出游戏引擎如何处理资产压缩.显然,他们在构建游戏时会压缩所有资产.但是他们如何在运行时解压缩它们.我唯一能想到的就是解压缩到内存中,但这必须是内存密集型的.如果他们解压到硬盘上,文件夹会在游戏正在播放时填满?这听起来效率不高.
使用带有c的zlib(或任何其他)库,这个运行时解压缩是如何完成的?
大卫
解决方法
有点像这样,你有一个拥有如此多数据的游戏,它不适合合理的内存量,所以你不能在内存中一次加载所有这些,所以你为你的数据定义了一些缓冲区用作缓存.
现在按照速度从最低到最高的顺序是这样的:
> DVD
>硬盘
> RAM
理想情况下,您不必从DVD流式传输数据,但如果您必须制作控制台游戏,则需要考虑这些因素.因此,对于每个可用存储空间,您可以定义一个缓冲区以用作缓存.
当游戏引擎确定它可能需要资产时,它应首先查看最快的缓存以查看资产是否已加载.如果是,那么你很幸运,你可以立即发送它.如果它不在最快的缓存中,则必须降低硬盘缓存的级别.这是一个文件,您可以保留已经解压缩并准备加载到内存中的资产.如果最快的缓存未完全占用,那么您可以开始加载数据并在准备就绪时使用它.如果没有足够的空间,那么您将不得不首先卸载其他资产,我建议删除最近最少使用的资产,直到您有足够的空间来加载新资产.
现在,如果硬盘缓存没有加载数据,那么你必须再下一个级别到存档,你将需要使用zip格式压缩它,因为zip文件格式不会强制你解压缩整个存档只能访问一个文件,所以你要做的就是找到存档中所述文件的偏移量并将其解压缩到硬盘缓存中.再次,如果缓存已满,您必须首先卸载其他一些资产,但如果您认为它会提高性能,您也可以尝试其他算法.
John Karmack在QuakeCon 2011上发表了主题演讲,他解释说整个过程可能比我在帖子中更好一点(其他很棒的东西),你可以找到它here