網上有不少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編譯...