skynet热更方式总结

skynet因为require有缓存,不能像如下方式热更:

package.loaded[module] = nil
require(module)

虽然可以如下这样清下缓存:

local cache = require "skynet.codecache"
cache.clear()

但是这样的成本比较大。只更新一个脚本,却把所有脚本的缓存清了。
skynet的DebugConsole服务提供一个更新service的方法:inject。
inject address script 将 script 名字对应的脚本插入到指定服务中运行(通常可用于热更新补丁)。
其原理就是修改skynet.dispatch的upvalue,如

--我们的服务里
skynet.dispatch("lua", function(session, source, cmd,...)
		local f = assert(CMD[cmd])
		skynet.ret(skynet.pack(f(...)))
	end)

我们就可以修改CMD。如下面的patch.lua脚本:

local CMD = _P.lua.CMD
CMD.test = function() 
	print('new')
end

如果需要更通用的热更方式可以参考云风的
如何让 lua 做尽量正确的热更新

如果模块添加约束条件,没有初始化程序,可以参考:jinq0123/hotfix

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值