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: 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资源的打包、加载、调试监控

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

  1. KSFramework:集成U3D热重载框架 - README

    KSFramework KEngine + SLua+ Framework = KSFramework KSFramework是一个整合KEngine.SLua的Unity 5开发框架,并为程序.美术 ...

  2. Java调用Lua脚本(热载实现)

    前言: Lua作为解析执行的脚本语言, 往往是易变逻辑编写的首选语言, 尤其是在游戏领域. C/C++和Lua的结合, 往往了标配. 比如Redis, Nginx其对Lua的支持, 也是杠杠的. 当然 ...

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

    Excel如何进行SVN协作.差异比较? 嗯,这是一个令人困惑的问题.游戏开发.程序开发时,使用Excel可以添加文档.注释.图标.批注等等各种辅助信息: 但是Excel是非纯文本格式,在使用SVN. ...

  4. lua热重载

    热重载,就是不重新开unity让代码的变化直接看出来,一般在开发时候使用 lua中通过require导入的文件,最终都存在package.loaded这个table中.require会判断是否文件已经 ...

  5. Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...

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

    在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...

  7. Redis进阶实践之十九 Redis如何使用lua脚本

    一.引言               redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...

  8. lua脚本简介

    Lua [1]  是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ier ...

  9. Redis学习-LUA脚本

    最近在做K线的项目中,需要计算商品的分时数据.为了保证多台机器对同一商品的计算的有序性,所以在Redis中进行计算,同时为了保证在分时数据计算过程的原子性所以使用了LUA脚本,Redis内置了对LUA ...

随机推荐

  1. html5标签的改变

    1.新的文档类型声明 浏览器解析html模式是有两种模式,按照各自浏览器的定义渲染的页面叫“怪异模式”,而按照w3c组织统一的标准渲染叫“标准模式”.一般都是使用标准模式来保持网页兼容性,区分这两种模 ...

  2. Oracle中用随机数更新字段----将一张表的数据插入另一张表----环境设置

    DECLARE CURSOR recordCursor IS SELECT longitude,latitude FROM WR_WIUST_B_SEC FOR UPDATE; recordRow r ...

  3. <转>DevExpress使用经验总结

    DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.本文主要介绍我在使用 DevExpress控件过程中,遇到或者发现的一些问题解决方案,或者也可以所示 ...

  4. PPT产品的重要性

    客户需求:减轻现场工作量,不能因为上了运维管理系统以后,工作量反而增加了,因此流程需要简化,除了需要符合国家安全规定的,其余流程都简化. 项目背景:当前算是处于POC阶段,给客户的项目经理展示我们的运 ...

  5. -[UIViewController _loadViewFromNibNamed:bundle:]

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewC ...

  6. Source Insight基本使用和快捷键

    Source Insight基本使用和快捷键 为什么要用Source Insight呢?貌似是因为比完整的IDE要更快一些,比较利于查看大量的代码. 软件的安装很简单,设置好安装目录. 配置好文档路径 ...

  7. dispatch

    GCD提供了并管理着若干FIFO队列(queues),可以通过block的形式向这些FIFO序列提交任务.GCD同时维护着一个线程池,所有的任务在线程池的线程运行. 系统提供的队列 main queu ...

  8. db2+python+sqlchemy环境的搭建

    记录了通过sqlalchemy 管理db2数据库的环境搭建 1.db2数据库安装配置 利用winscp复制iso文件到/mnt/IBM_db2 目录下 IBM_db2为自己创建 重命名 mv IBM\ ...

  9. 一些性能查询的SQL 备忘

    --检查数据库的等待事件 from v$session_waitwhere event not like 'SQL%' and event not like 'rdbms%' --找出系统中耗时的操作 ...

  10. Hadoop生态圈以及各组成部分的简介

    1.Hadoop是什么? 适合大数据的分布式存储与计算平台 HDFS: Hadoop Distributed File System分布式文件系统 MapReduce:并行计算框架 解决的问题: HD ...