如何将应用程序的多种资源(图像、声音、脚本、xml 等)组合到一个/多个二进制文件中,以便保护它们不被用户窃取?典型的步骤是什么(组织、加载、加密等)?
这在游戏开发中尤其常见,但许多游戏框架和引擎并没有提供一种简单的方法来做到这一点,也没有描述通用方法。我一直想学习如何做,但我不知道从哪里开始。有人能指出我正确的方向吗?
有很多方法可以做到这一点。 m_pGladiator 有一些好主意,尤其是序列化方面。我还想发表一些其他评论。
首先,如果您要将一堆资源打包到一个文件中(我称之为 packfiles),那么我认为您应该努力避免加载整个文件,然后将该文件反序列化到内存中。原因很简单,就是内存更大。我想这在 PC 上确实不是问题,但这是一个很好的做法,并且在控制台上工作时这是必不可少的。虽然我们(目前)没有像 m_pGladiator 建议的那样序列化对象,但我们正在朝着这个方向努力。
您可能拥有两种类型的包文件。其中之一是您想要任意访问文件内容的文件。第二种类型可能是您需要的文件集合all加载关卡时这些文件的数量。一个基本的例子可能是:
- 音频包文件可能包含游戏的所有音频。您可能只需要为菜单或界面屏幕加载某些类型的音频以及为级别加载不同的音频集。这可能属于上面的第一类。
- 属于第二类的类型可能是某个关卡的所有模型/纹理等。您基本上希望在加载时将该文件的全部内容加载到游戏中,因为当玩家玩该关卡或部分时您(可能)需要它的所有内容。
我们构建的许多包文件都属于第二类。我们基本上将关卡内容打包,然后用 zlib 之类的东西压缩它们。当我们在游戏时加载其中一个文件时,我们会读取少量文件,将读入的内容解压缩到内存缓冲区中,然后重复,直到将整个文件读入内存中。我们读入的缓冲区相对较小,而最终目标缓冲区足够大,可以容纳我们需要的最大未压缩数据集。这种方法很棘手,但同样,它节省了 RAM,这是一个有趣的练习,开始工作时,你会感到内心美好和温暖,因为你是系统资源的好管家。一旦包文件被完全解压到它的目标缓冲区中,我们就会在缓冲区上运行最后一次以修复指针位置等。只有当您将包文件写为游戏知道的结构时,此方法才有效。换句话说,我们的包文件编写工具与游戏代码共享结构(或类)。我们基本上是写出并压缩数据结构的精确表示。
如果您只是想减少在用户计算机上传送和安装的文件数量,您可以使用我描述的第一种包文件。也许您有数千个纹理,只是想减少必须压缩和打包的文件数量。您可以编写一个小实用程序,它基本上会读取要打包在一起的文件,然后在 packfile 中写入包含文件及其偏移量的标头,然后您可以一次一个地写入文件的内容在另一个之后,在您的大型二进制文件中。在游戏时,您可以简单地加载此包文件的标头并将文件名和偏移量存储在哈希中。当您需要读取文件时,您可以散列文件名并查看它是否存在于您的 packfile 中,如果存在,您可以通过查找偏移量然后从 packfile 中的该位置读取来直接从 packfile 中读取内容。同样,这种方法基本上是一种将数据打包在一起的方法,而不考虑加密等。它只是一种组织方法。
但我想再次强调,如果您要像我或 m_pGladiator 建议的那样,我会努力工作,不必将整个文件拉入 RAM,然后反序列化到 RAM 中的另一个位置。这是对资源的浪费(您可能拥有大量资源)。我想说你可以这样做来让它工作,然后一旦它工作,你可以使用一种方法,一次只读取文件的一部分,然后解压缩到你的目标缓冲区。不过,您必须使用像这样工作的压缩方案。 zlib 和 lzw 都可以(我相信)。我不确定 MD5 算法。
希望这有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)