将资源合并到单个二进制文件中

2024-03-07

如何将应用程序的多种资源(图像、声音、脚本、xml 等)组合到一个/多个二进制文件中,以便保护它们不被用户窃取?典型的步骤是什么(组织、加载、加密等)?

这在游戏开发中尤其常见,但许多游戏框架和引擎并没有提供一种简单的方法来做到这一点,也没有描述通用方法。我一直想学习如何做,但我不知道从哪里开始。有人能指出我正确的方向吗?


有很多方法可以做到这一点。 m_pGladiator 有一些好主意,尤其是序列化方面。我还想发表一些其他评论。

首先,如果您要将一堆资源打包到一个文件中(我称之为 packfiles),那么我认为您应该努力避免加载整个文件,然后将该文件反序列化到内存中。原因很简单,就是内存更大。我想这在 PC 上确实不是问题,但这是一个很好的做法,并且在控制台上工作时这是必不可少的。虽然我们(目前)没有像 m_pGladiator 建议的那样序列化对象,但我们正在朝着这个方向努力。

您可能拥有两种类型的包文件。其中之一是您想要任意访问文件内容的文件。第二种类型可能是您需要的文件集合all加载关卡时这些文件的数量。一个基本的例子可能是:

  1. 音频包文件可能包含游戏的所有音频。您可能只需要为菜单或界面屏幕加载某些类型的音频以及为级别加载不同的音频集。这可能属于上面的第一类。
  2. 属于第二类的类型可能是某个关卡的所有模型/纹理等。您基本上希望在加载时将该文件的全部内容加载到游戏中,因为当玩家玩该关卡或部分时您(可能)需要它的所有内容。

我们构建的许多包文件都属于第二类。我们基本上将关卡内容打包,然后用 zlib 之类的东西压缩它们。当我们在游戏时加载其中一个文件时,我们会读取少量文件,将读入的内容解压缩到内存缓冲区中,然后重复,直到将整个文件读入内存中。我们读入的缓冲区相对较小,而最终目标缓冲区足够大,可以容纳我们需要的最大未压缩数据集。这种方法很棘手,但同样,它节省了 RAM,这是一个有趣的练习,开始工作时,你会感到内心美好和温暖,因为你是系统资源的好管家。一旦包文件被完全解压到它的目标缓冲区中,我们就会在缓冲区上运行最后一次以修复指针位置等。只有当您将包文件写为游戏知道的结构时,此方法才有效。换句话说,我们的包文件编写工具与游戏代码共享结构(或类)。我们基本上是写出并压缩数据结构的精确表示。

如果您只是想减少在用户计算机上传送和安装的文件数量,您可以使用我描述的第一种包文件。也许您有数千个纹理,只是想减少必须压缩和打包的文件数量。您可以编写一个小实用程序,它基本上会读取要打包在一起的文件,然后在 packfile 中写入包含文件及其偏移量的标头,然后您可以一次一个地写入文件的内容在另一个之后,在您的大型二进制文件中。在游戏时,您可以简单地加载此包文件的标头并将文件名和偏移量存储在哈希中。当您需要读取文件时,您可以散列文件名并查看它是否存在于您的 packfile 中,如果存在,您可以通过查找偏移量然后从 packfile 中的该位置读取来直接从 packfile 中读取内容。同样,这种方法基本上是一种将数据打包在一起的方法,而不考虑加密等。它只是一种组织方法。

但我想再次强调,如果您要像我或 m_pGladiator 建议的那样,我会努力工作,不必将整个文件拉入 RAM,然后反序列化到 RAM 中的另一个位置。这是对资源的浪费(您可能拥有大量资源)。我想说你可以这样做来让它工作,然后一旦它工作,你可以使用一种方法,一次只读取文件的一部分,然后解压缩到你的目标缓冲区。不过,您必须使用像这样工作的压缩方案。 zlib 和 lzw 都可以(我相信)。我不确定 MD5 算法。

希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将资源合并到单个二进制文件中 的相关文章

  • 多个 Pod 的数据保护密钥轮换策略是什么?

    I used services AddDataProtection PersistKeysToFileSystem path ProtectKeysWithAzureKeyVault authData 加密数据保护密钥 部署后 24 小时内
  • 如何获取卫星资源DLL的模块句柄? (c++ Visual Studio)

    我们已将所有字符串移至 MFC 应用程序的资源 和附属 DLL 现在 主要语言已合并到 EXE 本身中 因此当我调用 LoadString 时 我只需传入 exe 的模块句柄即可 但是 我需要使其通用 如何以通用方式获取模块句柄 并确保在适
  • Java中获取资源文件夹中的文件

    我想读取 Java 项目的资源文件夹中的文件 我为此使用了以下代码 MyClass class getResource myFile xsd getPath 我想检查文件的路径 但它给出了以下路径 file home malintha m2
  • Spring boot打包后找不到资源文件

    我使用 Spring boot maven 插件将应用程序打包为 jar 文件 可以找到资源文件直接在Intellij IDEA中运行 但之后找不到资源文件 显示错误为 java io FileNotFoundException 类路径资源
  • 在 Rails 中的单个 RESTful POST 中创建多个资源

    我正在 Rails 中创建一个 API 以向我正在开发的 iPhone 应用程序公开 据我所知 通常在发布到 Rails 中控制器的创建操作时 您只创建一个资源 但是 我不确定一次创建许多资源的最佳方法 在单个 POST 中发布包含要创建的
  • Java中如何查找未关闭的I/O资源?

    Java 中的许多 I O 资源 例如 InputStream 和 OutputStream 在使用完毕后需要关闭 如前所述here http www coderanch com t 202922 Performance java Uncl
  • Gradle 插件从插件 jar 复制文件

    我正在创建我的第一个 gradle 插件 我正在尝试将文件从分发 jar 复制到我在项目中创建的目录中 尽管该文件存在于 jar 内 但我无法将其复制到目录中 这是我的任务代码 import org gradle api DefaultTa
  • RESTful 资源和正交资源问题

    如果我使用的 3 层应用程序具有通过 HTTP 访问的中间层中的面向 RESTful 资源的服务 那么向 UI 层提供正交资源的最佳方式是什么 一个例子是 用户 资源 它具有一个国家 地区的字段 属性 现在在 UI 层中编辑用户时 我希望能
  • 为什么 setImageResource 不显示任何内容?

    我想根据数据库值在 ListView 中显示一个图标 我跟随this https stackoverflow com questions 2192082 android changing an imageview src depending
  • Android上批量获取大量位图资源

    我有一长串图形 icon1 0 png icon1 1 png icon1 2 png icon12 0 png icon12 1 png icon12 2 png 我想将它们打包到我的android应用程序中 理想情况下 我认为我应该能够
  • Distribution Manifest.mf 中的单个点(“.”)是什么意思?

    最近我对 Manifest mf 文件中的类路径有点困惑 所以我想要的是将一些properties files从我的distribution jar中外包出来 并将它们放在它旁边 而不更改java source files 下面的例子 此时
  • 从 Resources 子文件夹中获取文件名

    在我的资源文件夹中 我有一个图像子文件夹 我想从该文件夹中获取这些图像的所有文件名 尝试了几个Resources loadAll之后获取 name 但没有成功的方法 这是实现我在这里想做的事情的正确做法吗 没有内置 API 可以执行此操作
  • Visual Studio 错误:已添加具有相同键的项目

    当我尝试更改控件的默认图像时在 Windows 窗体上在表单设计器中 无论在哪个控件上的哪个位置 我收到此错误 错误消息 具有相同的项目 密钥已经添加 我尝试删除并重新创建资源 resx文件 我保证只有 1 个带有这些键的 resx 文件存
  • 可绘制资源中带有形状的文本

    我可以在可绘制资源中创建文本形状吗 我在谷歌上搜索了很多 但什么也没找到 这是我的绘图文件
  • 在 Spring MVC 中管理 HTML 资源(CSS、JS 文件)

    是否可以像grails resources那样在Spring MVC中管理HTML资源 与此类似 http www anyware co uk 2005 2011 09 12 optimising your application with
  • 如何将图像文件从文档目录上传到iphone中的php服务器

    我目前正在开发画廊类的 iPhone 应用程序 根据我的要求 我需要将所有相机捕获的图像存储到文档目录中 文档文件夹中有一些 10 20 个图像文件 之后我必须使用单个 php url 将应用程序资源文档文件夹推送到服务器上 我已附加屏幕截
  • PHP 与 MySQL 中的资源 id #6 错误

    我这是为了我正在制作的投票系统 此代码向用户显示了他们可以从中选择的问题列表 div class main questions p class style1 style2 strong Select Your Question strong
  • .Resx 和 .Resources 文件类型有什么区别?

    我有很多 resources 文件 需要打开并查看 我下载了Zeta 资源编辑器 http www zeta resource editor com 但它仅适用于 Resx 文件 有区别吗 我可以打开 Resources 文件并提取其内容吗
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为

随机推荐

  • Graphviz - 如何使标签中的文本左对齐?

    我正在使用 graphviz 来可视化我正在解析的语言的 AST 我想包含源代码 作为标签 但 graphviz 对齐标签内的文本 这会扰乱我的缩进 并且代码对缩进敏感 这是问题的示例 第二行代码不应缩进 这是生成的 dot 文件的相关部分
  • 嵌套数组和 ConvertTo-Json

    要使用 REST API 我必须传递一个如下所示的 JSON 对象 series metric custom powershell gauge points 1434684739 1000 注意这里的嵌套数组 我无法重现这个 这是我的代码
  • decltype(auto) 和 decltype(returning expr) 作为返回类型有什么区别?

    有什么区别decltype auto and decltype returning expression 作为函数 模板 的返回类型如果expr在这两种情况下都没有使用括号吗 auto f gt decltype auto return e
  • 功能级别的任何黄瓜 Before 和 After 挂钩

    我已经经历过很多帮助 但都是关于场景级别的解释 Cucumber JVM 是否有功能级别的 Before 和 After 挂钩 这一页黄瓜钩 https stackoverflow com questions 23113370 is the
  • Symfony 2 - 在 Amazon S3 上上传图像的最佳实践

    我有一个表格 其中有一个file字段上传图像 我需要将此图像上传到 Amazon S3 一步一步构建这个 我开始将图像上传到本地磁盘上 现在它可以工作了 上传发生在我的实体内部Page因为建议在保存实体之前测试上传是否成功 我最终得到了这段
  • Firebase 检索嵌套数据

    我在尝试从 Firebase 检索时遇到了一些麻烦 基本上我的组表是这样的 在这种情况下 根据group ID KpFibCHjJ1xpfLd07WJ 有一个account ID KpFiX2L7ENt6EBgrB0S 右边将会有多个帐户
  • 上传后使用 ExpressJS 将文件存储在 Mongo 的 GridFS 中

    我已经开始使用expressJS 构建REST api 我是节点新手 所以请耐心等待 我希望能够让用户使用 upload 路由的帖子将文件直接上传到 Mongo 的 GridFS 根据我在expressJS文档中的理解 req files
  • 如何使用 JPA 2.1 转换连接的元素集合?

    我有3张桌子user user team and team user id number name varchar team name varchar user team user id number FK gt user id team
  • Mercurial Eclipse 错误

    我正在尝试在 Eclipse 中使用 Mercurial 我为此下载了 Mercurial Eclipse 插件 但是 尽管我重新安装了很多次 但还是出现同样的错误 我将屏幕截图放在下面 Checking encoding cp1254 C
  • 检查 rsync 命令是否运行成功

    以下 bash 脚本每小时执行一次文件夹的 rsync bin bash rsync r z c home pi queue email protected cdn cgi l email protection home foobar rm
  • Urllib2 中的代理身份验证错误 (Python 2.7)

    Windows 7 64 位 Python 2 7 如果我尝试使用 Urllib2 我会收到此错误 Traceback most recent call last File C Users cYanide Documents Python
  • 如何获取 Mac 版 zipalign?

    我已经有一个未签名版本的 apk 我正在尝试在我的 Mac 上对其进行签名 在最后一步 它建议对签名的 apk 进行 zipalign 但 mac 没有 zipalign 我做了 酿造搜索 仍然找不到它 我在网上搜索 找不到独立的 zipa
  • 在 git 中,有没有办法在不应用存储的情况下显示未跟踪的存储文件?

    如果我跑git stash u 我可以隐藏未跟踪的文件 但是 据说未跟踪的文件根本不会显示git stash show stash 0 有没有办法在不应用隐藏的情况下显示未跟踪的隐藏文件 未跟踪的文件存储在存储提交的第三个父级中 这实际上没
  • 将 Windows 容器(使用 Docker 创建)部署到 Azure 容器服务中

    我正在尝试完成一项关于如何在 Azure 域 环境中正确使用 Windows 容器的体系结构研究 在该域 环境中我必须容器化 Dot Net Core Web API 应用程序并将该容器部署到 Azure 容器服务中 这是我所做的事情 我确
  • Python 为消息添加自定义反应

    我想为多个命令添加多个自定义反应 或者如果我们添加反应列表 它将从该列表中添加随机反应 那么该怎么做呢 from discord utils import get 按名称添加表情符号 reactions emoji name 1 emoji
  • 如何消除视频中剧烈的亮度变化?

    我有从摄像机获得的图像流 我发现有时来自流的图像的亮度会出现很大的峰值 每个像素的值都会跳跃或下降 然后在下一个图像中返回到正常的亮度级别 这对我的算法来说是一个大问题 有什么办法可以防止这种亮度峰值吗 我正在考虑在每个像素上使用低通滤波器
  • 什么Python代码为二元运算符生成所有可能的分组(树)

    正如几个 SO 问题中所解释的 更抽象的是数学世界 http mathworld wolfram com BinaryBracketing html 加泰罗尼亚数字的序列恰好对应于可以为任何给定数量的运算符生成的括号分组的数量 但我还没有找
  • matlab中使用symsum求级数之和

    我有以下系列 我尝试了这段代码 但它没有打印最终结果 而是给出了一长串数字 syms n y symsum 1 sqrt n 1 100 Result y 2 1 2 2 3 1 2 3 5 1 2 5 6 1 2 6 and so on
  • JSF 2.0:何时调用encodeAll以及何时调用encodeBegin?

    考虑一个自定义 UIComponent 仅用于测试目的 public class UITest extends UIComponentBase Override public void encodeBegin FacesContext co
  • 将资源合并到单个二进制文件中

    如何将应用程序的多种资源 图像 声音 脚本 xml 等 组合到一个 多个二进制文件中 以便保护它们不被用户窃取 典型的步骤是什么 组织 加载 加密等 这在游戏开发中尤其常见 但许多游戏框架和引擎并没有提供一种简单的方法来做到这一点 也没有描