Lua熱過載

記憶體資料在過載後會丟失

KSFramework中,所有的UI Lua指令碼是可以過載的。指令碼中的一些記憶體資料,在過載後會丟失,比如:

-- 記錄一個UI介面被打開了多少次
local openCount = function UILogin:OnOpen()
openCount = openCount +
end return UILogin

如上,每一次的指令碼Reload,都是對openCount變數重新初始化為0,這與實際需求不符。

如何解決記憶體丟失?

為此,KSFramework中引入了Cookie機制——把狀態值存起來,避免被指令碼過載所影響,以上程式碼用加入Cookie機制:

function UILogin:OnOpen()
local openCount= Cookie.Get('UILogin.OpenCount')
if not openCount then
openCount =
end
openCount = openCount +
Cookie.Set('UILogin.OpenCount', openCount)
end return UILogin

Cookie是什麼?

cookie常見於http開發中,網站為了辨別使用者身份而儲存在使用者本地終端上的資料,可以叫做瀏覽器快取。
http是一種無狀態協議,比如在用php語言開發http網站時,開發者對程式碼的改動只需重新整理瀏覽器就可以立刻看到自己的改動,無需進行程序的啟停操作,開發起來十分方便。這也是php語言大熱的其中一個原因。

引入Cookie機制

KSFramework採用Lua來進行UI開發,支援熱過載來迅速修改程式碼;對Lua程式碼的熱過載最重要的考慮因素就是Lua執行記憶體狀態會丟失。

因此,KSFramework參考將HTTP領域的Cookie機制引入遊戲開發,所有的本地狀態值,都存放在Cookie中,邏輯與狀態分離。寫程式碼的過程即邏輯的過程,並不會影響當前的狀態。

Cookie的具體實現

Cookie的具體實現非常的簡單,它只不過是一個Hashtable,進行get/set操作,獲取或設定任意的物件:

圖:Cookie的程式碼實現

使用示例

快速入門的隨機公告 為例子:每一次過載lua指令碼,都會重新進行隨機。 有什麼辦法,讓這個例子中,首次載入進行隨機出1~3的數字?

這個數字儲存到Cookie。在我們對指令碼邏輯修改後,進行LUA指令碼過載,這時候從Cookie中拿回之前隨機的值進行使用。

-- 當不存在Cookie時,進行隨機;存在Cookie,直接取值
local rand = Cookie.Get('UIBillboard.RandomNumber')
if not rand then
rand = math.random(,)
Cookie.Set('UIBillboard.RandomNumber')
end

簡而言之——把狀態資訊儲存到Cookie中,與邏輯程式碼分離

當然了,這裡說的Cookie,跟HTTP的Cookie是不同的,僅僅是名稱的借用,來解決類似的問題。

版權說明

文/公的Kelly[mr-kelly](簡書作者)     Email: [email protected]
原文連結:http://www.jianshu.com/p/eebd5cfce87f
著作權歸作者所有,轉載請聯絡作者獲得授權,,並標註“簡書作者”。

KSFramework系列

github地址:https://github.com/mr-kelly/KSFramework

歡迎大家到 github提issues

KSFramework(整合U3D熱過載)README

KSFramework:Unity3D開發框架快速入門

KEngine策劃指南:配置表格的編輯與編譯

KEngine:Unity3D資源的打包、載入、除錯監控