lua熱更新



1、什麼是熱更新?

熱更新也叫不停機更新,是在遊戲服務器運行期間對遊戲進行更新。實現不停機修正bug、修改遊戲數據等操作。也可以這樣講:一輛車以時速150km跑着,突然爆胎了,然後司機告訴你,我不停車,你去把輪胎換了,小心點。恩

2、熱更新原理

第一種:

lua中的require會阻止多次加載相同的模塊。所以當需要更新系統的時候,要卸載掉響應的模塊。(把package.loaded裏對應模塊名下設置爲nil,以保證下次require重新加載)並把全局表中的對應的模塊表置 nil 。同時把數據記錄在專用的全局表下,並用 local 去引用它。初始化這些數據的時候,首先應該檢查他們是否被初始化過了。這樣來保證數據不被更新過程重置。 

代碼示例:

  1. function reloadUp(module_name)  
  2.     package.loaded[modulename] = nil  
  3.     require(modulename)  
  4. end  
function reloadUp(module_name)
    package.loaded[modulename] = nil
    require(modulename)
end
這種做法簡單粗暴,雖然能完成熱更新,但是問題很多,舊的引用的模塊無法得到更新,這種程度的熱更新顯然不能滿足現在的遊戲開發需求。

第二種:

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

    package.loaded[module_name] = old_module
end
發佈了45 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章