控制台和PC游戏有时会修复一些补丁,以解决开发人员错过/没有时间修复的错误。
我的问题是这些如何工作?
有时,补丁文件的大小为几兆字节。我不了解小文件如何更改已编译的程序。
控制台和PC游戏有时会修复一些补丁,以解决开发人员错过/没有时间修复的错误。
我的问题是这些如何工作?
有时,补丁文件的大小为几兆字节。我不了解小文件如何更改已编译的程序。
Answers:
有多种方法可以执行此操作,最简单的方法是对两个文件进行XOR并压缩它们(GZIP等)。这背后的理论是希望您可以得到大的零序列(相同值的长序列压缩得很好)。
您可以进一步了解该概念,并尝试查找两个文件中数据相同的区域,并完全忽略它们。
最后,您可以利用每种类型的文件的结构来发挥自己的优势。例如,在EXE中,您可以将每个方法单独打包(仅对已更改的方法进行打包),然后在补丁应用程序中自行重新构造EXE。但是请记住,这很可能在过度杀伤的领域中,并且不值得付出努力(简单bdiff的获得可能并不能证明可能在野外打破的额外复杂性)。作为另一个示例,您可以将diff文件用于脚本。
但是,大多数修补系统采用的是最简单的方法:它们只是打包已更改的文件-他们不会尝试仅将这些文件中的更改打包(可能有充分的理由,大多数游戏内容已被压缩并针对高熵或压缩数据根本不起作用)。
游戏的可执行代码并不总是驻留在可执行文件中,而是经常分为几个动态库(例如游戏,图形和声音引擎),实际可执行文件,以及可能出于各种目的的许多脚本。
补丁程序可以解决这些部分中的任何一个问题,而无需保证所有部分都进行更改。
与替换所有更改的文件不同,可以采用一种简单的方法是对它们进行二进制比较,然后仅打包要重新分发的实际差异。
(这当然只适用于您可以保证不会被用户更改的文件。)