cocos2d-x lua热更新问题,重载reload

1、什么是热更新?

热更新也叫不停机更新,是在游戏服务器运行期间对游戏进行更新。实现不停机修正bug、修改游戏数据等操作。也可以这样讲:一辆车以时速150km跑着,突然爆胎了,然后司机告诉你,我不停车,你去把轮胎换了,小心点。恩

2、热更新原理

第一种:

lua中的require会阻止多次加载相同的模块。所以当需要更新系统的时候,要卸载掉响应的模块。(把package.loaded里对应模块名下设置为nil,以保证下次require重新加载)并把全局表中的对应的模块表置 nil 。同时把数据记录在专用的全局表下,并用 local 去引用它。初始化这些数据的时候,首先应该检查他们是否被初始化过了。这样来保证数据不被更新过程重置。 

代码示例:

 

[cpp] view plain copy

  1. function reloadUp(module_name)  
  2.     package.loaded[modulename] = nil  
  3.     require(modulename)  
  4. end  

这种做法简单粗暴,虽然能完成热更新,但是问题很多,旧的引用的模块无法得到更新,这种程度的热更新显然不能满足现在的游戏开发需求。

 

 

 

第二种:

[cpp] view plain copy

  1. function reloadUp(module_name)  
  2.     local old_module = _G[module_name]  
  3.   
  4.     package.loaded[module_name] = nil  
  5.  
  6.     require (module_name)  
  7.   
  8.     local new_module = _G[module_name]  
  9.     for k, v in pairs(new_module) do  
  10.         old_module[k] = v  
  11.     end  
  12.   
  13.     package.loaded[module_name] = old_module  
  14. end  

我的理解就是,因为Lua中table是引用类型,所以需要深拷贝成员函数以及变量

reload之后再进行赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值