最早在折腾游戏客户端的时候,被别人问patch是什么意思,当时脑子里第一反应就是那个小小的更新文件,不是完整安装包,只改改动过的那部分内容。那时候网速很差,完整客户端几个G,要是每次更新都重新下全部文件,根本扛不住。

第一次接触patch,是老端游的手动更新。服务器放出来一个patch压缩包,下载之后,直接解压覆盖到游戏根目录就行。最开始分不清patch和完整安装包,傻乎乎把整个客户端删掉,重新下新版本,折腾了快一个小时。后来看论坛里别人的操作,才明白这个东西只记录文件之间的差异,没改动的文件不会重复下载。

很多人会把补丁和热更新混在一起。

当时玩的那个游戏,有两种更新方式。一种是需要退出游戏,手动打上patch,替换本地资源,改动比较大,像新增地图、修复严重bug,都要用这种。另一种是热更,游戏开着就能加载小改动,不用重启客户端。那会儿总以为这俩是同一个东西,直到某次打错patch版本,客户端直接启动报错,反复校验文件失败,才发现版本号对不上的时候,增量补丁根本没法生效。

软件行业里patch也不单单指游戏更新。之前看开源项目的讨论帖,开发者上传patch文件,里面写的是代码改动片段,reviewer拿到之后,可以把这段改动应用到原始代码上,不用把整套源码重新发一遍。这里的patch不是给普通用户用的安装文件,是代码层面的改动记录,两个场景下名词一样,作用逻辑接近,但使用对象完全不一样。这只是我的个人感受,不是标准答案。

还有个容易混淆的点,patch不是永远都小。大部分时候增量包体积远小于完整程序,但如果改动的资源文件特别多,图片、音效大量替换,patch的大小也会膨胀。我碰过一次,版本大更,patch文件接近1G,当时很意外,惯性觉得补丁就该是几百兆以内的小东西,下载的时候还以为下错了资源包。

打patch也不是百分百稳妥。覆盖文件之前,最好备份原文件。之前嫌麻烦,从来不去备份,某次第三方patch和官方文件冲突,本地文件损坏,只能校验完整性,重新下载缺失资源,白白浪费时间。有些程序会自带校验机制,应用patch之后自动核对文件哈希,一旦检测到文件异常,直接拒绝启动,防止程序崩溃。

日常口语里,偶尔还会见到patch用作动词。别人说给程序patch一下,意思就是打上补丁,修复漏洞或者追加内容。动词用法和名词用法经常一起出现,看多了才能分清语境。放到安全领域,系统漏洞修复的安全补丁,英文同样叫patch,本质思路没变,定位就是修补现有程序,而不是替换整套程序。

不是所有改动都会做成patch。如果程序底层改动范围太大,文件之间的依赖关系全部打乱,增量补丁制作成本太高,开发方就会直接发布完整新版本,不再提供patch。之前关注的一个工具软件,大版本迭代之后,直接停掉patch更新通道,只能下载全新安装包,当时还觉得不习惯,一直等着增量包出来。

现在很多软件都是自动后台更新,普通用户很少再会手动下载patch,很多人甚至不知道后台自动更新,底层就是在拉取patch包。手动打补丁的场景,大多留在老游戏、开源项目或者一些小众工具里。平时用手机软件,点更新下载的那个安装包,很多已经不是增量patch,是完整安装包,不同平台的更新策略差别很大。

那天晚上,把损坏的客户端文件校验修复完,关掉游戏启动器,电脑屏幕暗下去,脑子里还在回想,同一个单词,放到游戏、代码、系统安全里,内核逻辑相通,使用方式却差这么多。