Lua熱更新原理及示例

2021-07-22 13:43:45 字數 1831 閱讀 8248

網上有不少lua熱更新的文章,都只說了理論,被沒有給出實際可操作的**,下面是我寫的幾個例子。

lua的require(modelname)把乙個lua檔案載入存放到package.loaded[modelname]。

當我們載入乙個模組的時候,會先判斷是否在package.loaded中已存在,若存在則返回改模組,不存在才會載入(loadfile),防止重複載入。

package.loaded是乙個table,其中包含了全域性表_g、預設載入的模組(string, debug, package, io, os, table, math, coroutine)和使用者載入的模組。

function

reload_module

(module_name)

package.loaded[modulename] = nil

require(modulename)

end

這樣做雖然能完成熱更,但問題是已經引用了該模組的地方不會得到更新, 因此我們需要將引用該模組的地方的值也做對應的更新。

function

reload_module

(module_name)

local old_module = _g[module_name]

package.loaded[module_name] = nil

require (module_name)

local new_module = _g[module_name]

for k, v in

pairs(new_module) do

old_module[k] = v

endpackage.loaded[module_name] = old_module

end

-- test.lua

module(..., package.seeall)

function

func

(a, b)

return a * b -- 改為 a + b 再次呼叫

end

-- main.lua

require

"test"

function

mainloop

() local ret = test.func(10, 10)

print (ret)

endfunction

reload_module

(module_name)

local old_module = _g[module_name]

package.loaded[module_name] = nil

require (module_name)

local new_module = _g[module_name]

for k, v in

pairs(new_module) do

old_module[k] = v

endpackage.loaded[module_name] = old_module

endfunction

reload

() local ms =

for k, v in

pairs(ms) do

reload_module(v)

endend

在終端中執行main指令碼:

lua面試題 熱更新簡介 原理及示例

1 什麼是熱更新?熱更新也叫不停機更新,是在遊戲伺服器執行期間對遊戲進行更新。實現不停機修正bug 修改遊戲資料等操作。也可以這樣講 一輛車以時速150km跑著,突然爆胎了,然後司機告訴你,我不停車,你去把輪胎換了,小心點。恩 2 熱更新原理 第一種 並把全域性表中的對應的模組表置 nil 同時把資...

lua 熱更新原理 一

熱更一般是針對模組的線上替換。我們動態載入要熱更的模組試試。例如,我們在迴圈間隔載入某模組,這樣就能有時間去更改模組了。測試的 如下 for i 1,5 do local m require other print other.a is m.a sleep 5 end我們迴圈載入了other這個模組...

lua 熱更新模組

最近準備在手機專案客戶端中使用lua,以前一直在伺服器使用luabind.另外,tolua 也體驗過,luaplus也在早年用過.以下是本人對這些繫結庫的個人感覺 luabind 利用boost機制把繫結做到極致,比較適合主c 弱lua的指令碼框架.作者已經停止更新,在windows linux編譯...