- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试找出游戏引擎如何处理 Assets 压缩。显然,他们在构建游戏时压缩了所有 Assets 。但是他们如何在运行时解压缩它们。我唯一能想到的就是解压缩到内存中,但这一定是非常占用内存的。如果他们解压缩到硬盘上,那么在玩游戏时文件夹会被填满吗?这听起来效率不高。
在 c++ 中使用像 zlib(或任何其他)这样的库,这个运行时解压缩是如何完成的?
大卫
最佳答案
有点像这样,你有一个游戏有太多的数据,它不会适合合理的内存量,所以你不能在内存中一次加载所有的数据,所以你定义了一些缓冲区您用作缓存的数据。
现在按速度从低到高排序的内存是这样的:
理想情况下,您不必从 DVD 流式传输数据,但如果您必须制作主机游戏,则需要考虑这一点。因此,对于这些可用存储空间中的每一个,您都定义了一个缓冲区以用作缓存。
当游戏引擎决定它可能需要一个 Assets 时,它应该首先在最快的缓存中查找 Assets 是否已经加载。如果是,那么您很幸运,您可以立即将其送去抽奖。如果它不在最快的缓存中,则必须下一级到硬盘缓存。这是一个文件,您可以在其中保存已经解压缩并准备加载到内存中的 Assets 。如果最快的缓存没有被完全占用,那么您可以开始加载数据并在准备就绪时使用它。如果没有足够的空间,那么您将不得不先卸载其他 Assets ,我建议您删除最近最少使用的 Assets ,直到您有足够的空间来加载新 Assets 。
现在如果硬盘缓存没有加载数据那么你必须再向下一层到存档,你会想要使用 zip 格式来压缩它,因为 zip 文件格式不会强制你解压缩整个存档以访问一个文件,因此您所要做的就是找到存档中所述文件的偏移量并将其解压缩到硬盘驱动器缓存中。同样,如果缓存已满,您必须先卸载一些其他 Assets ,我再次建议删除最近最少使用的 Assets ,但如果您认为它会提高性能,您也可以尝试其他算法。
约翰·卡马克 (John Karmack) 在 QuakeCon 2011 上发表了主题演讲,他解释了整个过程,可能比我在帖子中的解释要好一些(还有其他很棒的东西),您可以找到它 here
关于c++ - 游戏引擎运行时解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11257218/
我是一名优秀的程序员,十分优秀!