KSFramework常见问题:Lua脚本热重载,内存状态数据丢失?

Lua热重载

内存数据在重载后会丢失

KSFramework中,所有的UI Lua脚本是可以重载的。脚本中的一些内存数据,在重载后会丢失,比如:

-- 记录一个UI界面被打开了多少次
local openCount = 0

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

return UILogin

如上,每一次的脚本Reload,都是对openCount变量重新初始化为0,这与实际需求不符。

如何解决内存丢失?

为此,KSFramework中引入了Cookie机制——把状态值存起来,避免被脚本重载所影响,以上代码用加入Cookie机制:

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语言大热的其中一个原因。

引入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(1,3)
        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资源的打包、加载、调试监控

时间: 2024-10-11 21:13:35

KSFramework常见问题:Lua脚本热重载,内存状态数据丢失?的相关文章

KSFramework常见问题:Excel如何进行SVN协作、差异比较?

Excel如何进行SVN协作.差异比较? 嗯,这是一个令人困惑的问题.游戏开发.程序开发时,使用Excel可以添加文档.注释.图标.批注等等各种辅助信息: 但是Excel是非纯文本格式,在使用SVN.Git等版本管理软件时,多人进行编辑就会非常容易造成冲突,无法自动合并. 而且在冲突以后,我们很难得知究竟别人改动了哪里. Excel差异比较的几种方法 因此,总结一下以下方法,可以对Excel表格进行差异比较: 使用Beyond Compare比较Excel 使用TSV表格代替Excel Tort

检查HP服务器内存状态脚本

脚本1(如有问题则发邮件通知): # vi disk.sh 按a或i进入编辑模式 #!/bin/bash Name=`hostname` Date=`date +%m%d%y` Num=`dmidecode | grep -i 'serial number' | head -n 1` Mem=`/sbin/hpasmcli -s "show dimm" | grep Status | awk -F[:" "]+ '{print $2}'`Mem=`/sbin/hpa

Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween

在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此事.本篇文章就来继续这个工作. 从Lua中调用C#代码 1.创建UI监听脚本 打开之前的工程,在Assets/LuaFrameworks/Scripts/Common下,创建一个UIEventEx.cs脚本,将LuaBehaviour.cs中的AddButtonClick以及AddInputFiel

Lua脚本在C++下的舞步(入门指引)(转)

http://www.cnblogs.com/hmxp8/archive/2011/11/23/2259777.html 转帖来自:http://www.acejoy.com/bbs/viewthread.php?tid=1931&extra=page%3D1 现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者NPC的状态...

redis翻译_redis lua脚本

Available since 2.6.0.  加入版本2.6 Time complexity: Depends on the script that is executed. 时间复杂度: 取决于脚本的执行 出处:http://blog.csdn.net/column/details/redisbanli.html Introduction to EVAL  介绍EVAL EVAL and EVALSHA are used to evaluate scripts using the Lua i

wax lua 脚本升级练习(2)

wax lua 脚本升级练习(1)介绍了object-c通过调用lua中的函数计算两值乘积并返回显示. 这一篇将介绍通过点击按钮下载新的lua脚本文件,并且热加载lua,使起能即时生效. 在写代码前需要做一点点准备. 1.启动本机的Apache服务,作为新lua脚本的存放位置 打开"终端(terminal)",输入sudo apachectl start(可能需要输入机器秘密),打开Safari浏览器地址栏输入 "127.0.0.1",可以看到内容为"It

Lua中的线程和状态

1.概述 线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),线程类型是实现协程(coroutines)的基础,注意这里的线程类型不要与操作系统线程混淆,Lua的线程类型是Lua虚拟机实现一种数据类型. 从Lua脚本来看,一个协程就是一个线程类型,比如: local co = coroutine.create(function() print("hi") end) print(co) --outp

Redis Lua 脚本使用

Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 Lua 的示例,里面注释部分会讲解相关的作用: -- -- -- 拿客 -- 网站:www.coderknock.com -- QQ群:213732117 -- 三产 创建于 2017年06月15日 12:04:54. -- 描述: -- -- local strings website = "coderknock.com" print(we

cocos2d-x+lua代码热加载(Hot Swap)的研究

代码热加载跟自动更新无关,主要目的是在程序运行的时候动态的替换代码,从而实现不重启程序而更新代码的目的.最理想的情况当然是我修改完代码并保存,然后就可以直接在游戏中看到修改后的效果,这个在实际开发过程中会大大提高效率. 即便达不到理想情况,我们也希望可以实现部分热加载,从而简化操作.例如我们可以仅仅对配置文件.消息文件.界面文件实现热加载,这样策划更新数据后可以直接在游戏中看结果,而不需要重新打开客户端去跑任务. 热加载主要原理其实很简单,lua require文件都会缓存在package.lo