Lua 腳本載入簡述和運行時腳本刷新


1.腳本載入上,loadfile、dofile、require是比較常用的,具體區別網上有些博文已經寫的很好了,如歲月_無恆的http://blog.csdn.net/leecrest/article/details/31742419 和藍色雪狐的http://blog.163.com/hbu_lijian/blog/static/126129153201422902256778/。這里簡單概括:

(1)loadfile編譯代碼成中間碼並且返回編譯后的chunk作為一個函數,而不執行代碼。一次編譯的返回結果可以多次被運行。

(2)dofile讀入代碼文件並編譯執行。每調用dofile一次,都會重新編譯執行一次。

(3)require比較接近dofile,但require會先在package.loaded中查找此模塊是否存在,會判斷文件是否已經加載避免重復加載同一文件。目前項目主要都是用require。

 

2.由於項目中未開發出UI編輯器,所以用Lua開發界面時經常為了校正一個控件位置不斷地重新打開游戲查看效果,工作效率很受影響。為了提高開發效率,就寫了一些代碼讓lua腳本在不關閉游戲情況下去實時熱更腳本,保證程序猿能在修改lua文件后,立即在游戲里看到效果。大致的機制如下:

(1)監控鍵盤中特定按鍵的按下事件,在監聽到按鍵按下后開始進行刷新腳本的操作

(2)由於整個UI界面都是Lua開發,所以不可能去刷新全部UI界面,一般來說保持地圖塊、人物模型等基礎界面不變,去刷新用戶打開的窗口就足夠了。因此首先先獲取當前屏幕中展現的窗口視圖類。(一個好的UI框架應該能實時監控到用戶當前打開了幾個窗口,左、右、中間分別是什么窗口類)

(3)根據當前窗口類,從預先建立好的“窗口類---文件列表目錄”映射table中拿到這個窗口類所對應的多個lua文件的相對路徑(一個窗口類可能由多個lua文件構成,所以映射的文件路徑可能有多個)。

(4)對拿到的腳本文件路徑進行重載,如下所示:

 

local function require_ex( file_path )
	package.loaded[file_path] = nil    -- 消除載入記錄
	require( file_path )                      -- 重新加載lua文件
end

 

(5)這個時候雖然腳本文件已經重新載入了,但是目前內存中保留的還是舊文件的內容,所以還要清除內存中所有對舊文件內容的引用並創建新文件內容的引用。也就是說要銷毀當前展示的窗口,並將所有持有當前打開窗口的引用的變量置空。然后創建新的窗口類對象,賦值給所有之前持有當前打開窗口的引用的變量。並重新展示窗口。

如此一來,程序猿即可在修改完lua文件、按下特定按鍵后看見自己的窗口重新繪制的效果了。

 

3.運行時腳本刷新除了運用在開發調試過程,在玩家客戶端熱更代碼后應該也會有這個流程。“據說”是在一個lua腳本文件A.lua中進行全局文件的重新加載,然后重新加載A.lua。其中要注意避免讓一個lua文件刷新自己,這樣是不能成功刷新的。具體的流程因為沒接觸過這方面工作,所以目前只能等待以后補充

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM