代码热加载跟自动更新无关,主要目的是在程序运行的时候动态的替换代码,从而实现不重启程序而更新代码的目的。最理想的情况当然是我修改完代码并保存,然后就可以直接在游戏中看到修改后的效果,这个在实际开发过程中会大大提高效率。 即便达不到理想情况,我们也希望可以实现部分热加载,从而简化操作。例如我们可以仅仅对配置文件、消息文件、界面文件实现热加载,这样策划更新数据后可以直接在游戏中看结果,而不需要重新打开客户端去跑任务。
热加载主要原理其实很简单,lua require文件都会缓存在package.loaded里面,当重新加载文件的时候,把这个置空,然后重新require对应文件就可以了。
实际应用中会有更多需要考虑的因素,所以完全的代码热加载很复杂(原理很简单,但是实现很复杂,需要关注的因素很多)。
CocosIDE展示了代码热加载的效果:编辑场景中图片的位置并保存,然后图片自动放置到新的位置上面了。 这个效果看着非常神奇,但是实际上并没有什么实用价值。因为它的热加载,其实就是重新require文件(基于上面提到的原理)的过程,这个过程中会重新require 'main.lua',从而整个游戏都会被重新启动。当我们只有一个简单的场景的时候,就可以实现看起来很完美的热加载。然而,由于实际游戏客户端项目会比这个复杂很多,我们会涉及到多场景、多界面、多状态的维护,所以想实现没有Bug的热加载是很困难的。
现在只研究了一部分,初步可行,后期完善了会更加实用。
1、按R键重新加载所有的lua脚本。这个后面可以做很多优化。比如windows下检测文件变化,而不需要手动按键。只重新加载改变的文件而不是所有文件都遍历一遍。
local listener = cc.EventListenerKeyboard:create();
listener:registerScriptHandler(function(keycode, evt)
--print(keycode)
if keycode == 138 then
-- 按R重新加载代码
reload_script_files();
-- 逻辑代码 重新加载所有的配置
-- 逻辑代码 关闭并重新打开当前已打开的窗口
end

本文介绍了cocos2d-x+lua环境下代码热加载的概念和实现原理,旨在提高开发效率。通过清理package.loaded并重新require文件实现热加载,但实际应用中面临多场景、多状态的挑战。目前仅实现部分功能,如按R键重新加载lua脚本,并提出优化方案,如检测文件变化自动加载。全局变量、函数调用的处理、配置文件更新和界面刷新等都是热加载要考虑的问题。尽管无法做到完全无缝加载,但已能显著提升开发效率。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



