介绍:
热更新,就是在维持服务不间断的情况下,对软件代码逻辑或配置数据进行更新修复。随着游戏项目引入了脚本语言以后,热更新技术逐渐成为了标配,在我经历过的游戏项目中,无论是服务端还是客户端,版本的更新迭代都是围绕着静态patch和动态patch(热更新)来进行的。下面来谈一下客户端Python热更新的处理。
原理:
标准import
我们知道,import可以导入一个标准的python模块,将模块载入内存,并加到sys.modules中。多次import同一模块只是将名称导入到当前的Local名字空间,也就是一个模块不会重复载入。
reload函数
reload()函数可以重新载入已经导入的模块,这样看起来就可以热更新python模块了。可惜的是,python原生的reload函数远不能满足游戏热更新的问题,原因如下:
reload重新加载的模块不会删除旧版本的模块,也就是已经引用的旧模块无法更新
同样因为不能旧对象的引用,使用from ... import ... 方式引用的模块同样不能更新
reloas(m)后,class及其派生class的实例对象,仍然使用旧的class定义。
加载模块失败时候,没有rollback机制,需要重新import该模块
因此,有必要结合游戏的情景,自定义适合的reload。新的自定义reload目的是为了达到在原程序不结束的情况下,让程序能动态加载改动后的代码。主要想达到下面两点:
提升开发期的开发效率
在游戏不重启的情况下修复紧急BUG
实现: