KSFramework常見問題:Lua腳本熱重載,內存狀態數據丟失?

Lua熱重載

內存數據在重載後會丟失

KSFramework中,全部的UI Lua腳本是能夠重載的。腳本中的一些內存數據,在重載後會丟失,好比:php

-- 記錄一個UI界面被打開了多少次
local openCount = 0

function UILogin:OnOpen()
    openCount = openCount + 1
end

return UILogin

如上,每一次的腳本Reload,都是對openCount變量從新初始化爲0,這與實際需求不符。html

如何解決內存丟失?

爲此,KSFramework中引入了Cookie機制——把狀態值存起來,避免被腳本重載所影響,以上代碼用加入Cookie機制:git

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

return UILogin

Cookie是什麼?

cookie常見於http開發中,網站爲了辨別用戶身份而儲存在用戶本地終端上的數據,能夠叫作瀏覽器緩存。
http是一種無狀態協議,好比在用php語言開發http網站時,開發者對代碼的改動只需刷新瀏覽器就能夠馬上看到本身的改動,無需進行進程的啓停操做,開發起來十分方便。這也是php語言大熱的其中一個緣由。github

引入Cookie機制

KSFramework採用Lua來進行UI開發,支持熱重載來迅速修改代碼;對Lua代碼的熱重載最重要的考慮因素就是Lua運行內存狀態會丟失。瀏覽器

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

Cookie的具體實現

Cookie的具體實現很是的簡單,它只不過是一個Hashtable,進行get/set操做,獲取或設置任意的對象:cookie

1835687-e2fc7337ce013701

圖:Cookie的代碼實現框架

 

使用示例

快速入門的隨機公告 爲例子:每一次重載lua腳本,都會從新進行隨機。 有什麼辦法,讓這個例子中,首次加載進行隨機出1~3的數字?dom

這個數字保存到Cookie。在咱們對腳本邏輯修改後,進行LUA腳本重載,這時候從Cookie中拿回以前隨機的值進行使用。網站

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

簡而言之——把狀態信息保存到Cookie中,與邏輯代碼分離

固然了,這裏說的Cookie,跟HTTP的Cookie是不一樣的,僅僅是名稱的借用,來解決相似的問題。

版權說明

文/公的Kelly[mr-kelly](簡書做者)     Email: 23110388@qq.com
原文連接:http://www.jianshu.com/p/eebd5cfce87f
著做權歸做者全部,轉載請聯繫做者得到受權,,並標註「簡書做者」。

 

KSFramework系列

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

歡迎你們到 github提issues

 

KSFramework(集成U3D熱重載)README

KSFramework:Unity3D開發框架快速入門

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

KEngine:Unity3D資源的打包、加載、調試監控

相關文章
相關標籤/搜索