脚本的热更新的流程都大同小异, 第一步先保存旧代码的块的数据, 第二部加载新的代码块,第三步将旧代码块的局部和全局数据拷贝到新代码块的对应的

变量中。

在服务器热更新中,主要考虑热更的内容是什么, 一般更新分两种,一种是逻辑的更新,一种是变量的值更新。

先谈论第一种,在lua 5.3中,继承了新的debug.upvaluejoin(f1, i, f2, j)函数,能将函数f1的第i个个upvalue引用f2的第j个upvalue,

可以通过debug.getupvalue函数,获取ENV 的upvalue来的索引位置,找到该位置后,可以通过debug.upvaluejoin函数来实现env的交换。

第二种就是要更新变量值,lua中的变量值更新,除了table外,其它变量类型都可以通过直接赋值来改变值的大小。由于table的回收,会导致其它引用

该table的变量都会收到影响,会导致错误的发生,所以, table的值更新,不能通过直接赋值, 可以通过移除table里面的所有元素的值,table的table除外,

然后将新table的所有元素的值遍历赋值给旧的table,注意的是不能将table也赋值,如果新table里有新的子元素是table类型,必须要在旧table对应值里重新

创建一个新的table,递归将值拷贝。

以下是table的拷贝方法实现热更的过程:

HotFixTable = {}

-- copy a old table's all key and value  to new table, but don't release old table
local function copyTable( oldTbl, newTbl)
for k, v in pairs(newTbl) do
if type(v) == "table" then
if type(oldTbl[k]) ~= "table" then
oldTbl[k] = {}
end
copyTable( oldTbl[k], v)
else
oldTbl[k] = v
end
end
return oldTbl, newTbl
end --table no need release
local function clearTable(tbl)
for k, v in pairs(tbl) do
if type(v) ~= "table" then
tbl[k] = nil
else
clearTable(v)
end
end return tbl
end --use file to hotfix the source table
function HotFixTable.hotFixByFileName(fileName, sourceTbl)
local deskTbl
local function newIndexFunc(tbl, name, value)--t:table, name:key, f:function
deskTbl = value
end local dummy_env = setmetatable({}, { __newindex = newIndexFunc })
local f, err = loadfile(fileName, "bt", dummy_env)
if f then
local ok, err = pcall(f)
assert(ok, err)
if ok then
clearTable(sourceTbl)
copyTable(sourceTbl, deskTbl)
end
end
end --use lua string to hotfix the table
function HotFixTable.hotFixByData(hitfixContent, sourceTbl)
local deskTbl
local function newIndexFunc(tbl, name, value)--t:table, name:key, f:function
deskTbl = value
end local dummy_env = setmetatable({}, { __newindex = newIndexFunc })
local f, err = load(hitfixContent, "=patch", "bt", dummy_env)
if f then
local ok, err = pcall(f)
assert(ok, err)
if ok then
clearTable(sourceTbl)
copyTable(sourceTbl, deskTbl)
end
end
end

调用方法如下:

HotFixTable.hotFixByFileName("新table的保存所在文件", 旧table)

最新文章

  1. ABBA BABA statistics
  2. Python之路-(Django(Cookie、分页))
  3. [PHP] - Laravel - Route路由
  4. 多个mysql解决方法
  5. 理解和解决MySQL乱码问题【转】
  6. java-Filter过滤器
  7. redhat 下Redis安装
  8. MongoDB 性能优化五个简单步骤
  9. about Q&A in installing linux[centos6,7]
  10. Matlab中Rand()函数用法
  11. jquery input只允许输入数字
  12. ASP.NET最常用的页面生命周期事件
  13. web标准(复习)--2 列布局
  14. python学习-day3
  15. 求和问题(DFS)
  16. 纯css 构造的tip
  17. jQuery.validate表单校验+bootstrap
  18. sql sever分组查询和连接查询
  19. 洛谷 [P2825] 游戏
  20. CentOS Too Many Open Files 解决

热门文章

  1. IT 面试题
  2. hdu1693Eat the Trees(插头dp)
  3. C 语言实例 - 循环输出26个字母
  4. [BeiJing wc2012]连连看
  5. python序列化模块 json&&pickle&&shelve
  6. Qconf安装文档
  7. (转)COBBLER无人值守安装
  8. 机器学习框架ML.NET学习笔记【6】TensorFlow图片分类
  9. 洛谷P3959 宝藏(模拟退火乱搞)
  10. Android笔记--View绘制流程源码分析(二)