最新 | 最热门 | 最高评价

+0  在 Unity3D 的 Mono 虚拟机中嵌入 Lua 的一个方案

Tag: lua与虚拟机 | 游戏开发
云风 发于 2017年01月08日 22:39 | 点击: 413 | 展开摘要
很多使用 Unity3D 开发的项目,都不太喜欢 C# 这门开发语言,对于游戏开发很多人还是更喜欢 Lua 一些。而 Lua 作为一门嵌入式语言,嵌入别的宿主中正是它说擅长的事。这些年,我见过许多人都做过 U3D 的 Lua 嵌入方案。比如我公司的阿楠同学用纯 C# 实现了一个 Lua 5.2 (用于在 U3D web 控件中嵌入 Lua 语言的 UniLua );还有 ulua slua wlua plua xlua ... 数不胜数。我猜测,a-z 这 26 个字母早就用

查看全文: http://www.udpwork.com/item/16056.html

+0  如何让 lua 做尽量正确的热更新

Tag: lua与虚拟机
云风 发于 2016年11月25日 17:28 | 点击: 654 | 展开摘要
很多项目采用 lua 的一大原因是 lua 可以方便的做热更新。

你可以在不中断进程运行的情况下,把修改过的代码塞到进程中,让随后的过程运行新版本的代码。这得益于 lua 的 function 是 first class 对象,换掉代码不过是在让相应的变量指向新的 function 对象而已。

但也正因为 lua 的这种灵活性,想把热更新代码这件事做的通用,且 100% 做对,又几乎是不太可能的。

首先,你很难准确的定义出,什么叫做更新,哪些数据需要保留,哪些需要替换成

查看全文: http://www.udpwork.com/item/15940.html

+0  如何优雅的实现一个 lua 调试器

Tag: lua与虚拟机
云风 发于 2016年11月20日 23:46 | 点击: 398 | 展开摘要
最近一段时间在帮公司一个项目组的客户端 review 代码。

我们的所有项目,无论渲染底层是用的 ejoy2d 还是 Unity3d ,实际开发的时候都基本是使用 lua 。所以开发人员日常工作基本是在和 Lua 打交道。

虽然我个人挺反感围绕着调试的开发方式,也就是不断的在测试、试错,纠正的循环中奔波。我认为好的程序应该努力在编写的过程中,在头脑中排错;在预感到坏味道时,就赶快重写。而坏味道通常指代码陷入了复杂度太高的境地,无法一眼看出潜在的问题。对付复杂度最好的武器是

查看全文: http://www.udpwork.com/item/15933.html

+0  Lua 中 Cache 冷数据的落地

Tag: lua与虚拟机
云风 发于 2016年11月03日 12:17 | 点击: 321 | 展开摘要
今天有同学跟我讨论了一下最近发现的一个 bug ,我觉得挺有意思的。

需求是这样的:

我们的系统中,有一些数据是从外存(数据库)加载进来的,由于性能考虑,并不需要每次修改这些数据就写回外存。希望在数据变冷后,定期落地即可。

典型的场景是一个 cache 模块,cache 的是一些玩家的业务数据,可以通过 uuid 从数据库索引到。一旦业务需要访问玩家数据,cache 模块会从数据库加载对应数据,然后把数据表交出去。当业务再次需要这些数据的时候,cache 模块一旦发现数

查看全文: http://www.udpwork.com/item/15901.html

+0  ephemeron table 对 property tables 的意义

Tag: lua与虚拟机 | 语言与设计
云风 发于 2016年09月19日 20:56 | 点击: 382 | 展开摘要
今天在公司群里,Net bug 同学提出了一个问题,围绕这个问题大家展开了一系列讨论。讨论中谈及了 lua 中的一个常见的模式:property table ,我觉得挺有意思,记录一下。

最初的问题是:当一个对象的某些属性并不常用,希望做惰性初始化的话,应该怎么实现。

我认为,property table 是一个很符合这个案例的常见模式。

比如,对象 f 有三个可能的成员 a b c ,我们可以不把 f.a f.b f.c 记录在 f 这个 table 里,而是额外有三

查看全文: http://www.udpwork.com/item/15835.html

+0  Lua 稀疏数组

Tag: lua与虚拟机
云风 发于 2016年08月29日 00:02 | 点击: 422 | 展开摘要
Lua 的 table 可以做数组用,但是前提是数组里不能有空洞。也就是不能在数组里保存 nil ,否则取长度和迭代的行为都是不确定的。

能不能用比较小的额外代价在 Lua 中实现一个支持空洞的数组呢?

首先,我们定义一下,带空洞的 array 的正确行为应该是怎样的:

数组只能用正整数做 key ,设置其它 key 会抛出 error 。

可以用 pairs 迭代数组,和普通的 table 一样,迭代器会跳过那些值为 nil 的键值对。但要求迭代器一定从 1 开始从

查看全文: http://www.udpwork.com/item/15768.html

+0  正确的序列化 Lua 中带元表的对象

Tag: lua与虚拟机 | skynet
云风 发于 2016年06月23日 22:00 | 点击: 397 | 展开摘要
在 Lua 5.2 之后的版本,约定了在元表中可以给出一个 __pairs 方法,而 lua 的基础库 pairs 会使用这个元方法来迭代一个对象。

Lua 5.3 之后的版本,取消了 lua 5.2 中的 __ipairs 约定,而统一使用 lua_geti 来访问整数为索引的数组。

可惜的是,许多 lua 序列化库对此支持的并不好。今天我在改进 bson 的序列化库时,重新考虑了这个问题,看看这个序列化过程怎么做,才能更好的支持 lua 5.3 以后的约定。

在 s

查看全文: http://www.udpwork.com/item/15614.html

+0  lua 常量表优化

Tag: lua与虚拟机
云风 发于 2016年04月12日 21:06 | 点击: 468 | 展开摘要
今天花了一天尝试给 lua vm 做了一点优化:

现在 lua 的函数原型里保留有一张常量表,引用了 string ,number ,nil ,boolean 类型的常量。

table 是不能为常量的,所以当你想迭代一个常量数组的时候,

for _, v in ipairs { "one", "two", "three" } do

其实每次都会临时构建一张表,并依次插入 "one", "two", "three" 。

或者你想返回一个常量构成的表:

functio

查看全文: http://www.udpwork.com/item/15394.html

+0  嵌入式 lua 中的线程库

Tag: lua与虚拟机 | 语言与设计
云风 发于 2016年01月17日 22:13 | 点击: 625 | 展开摘要
无论是客户端还是服务器,把 lua 作为嵌入语言使用的时候,都在某种程度上希望把 lua 脚本做多线程使用。也就是你的业务逻辑很可能有多条业务线索,而你希望把它们跑在同一个 lua vm 里。

lua 的 coroutine 可以很好的模拟出线程。事实上,lua 自己也把 coroutine 对象叫做 thread 类型。

最近我在反思 skynet 的 lua 封装时,想到我们的主线程是不可以调用阻塞 api 的限制。即在主干代码中,不可以直接 yield 。我认为可以

查看全文: http://www.udpwork.com/item/15135.html

+0  skynet 里的 coroutine

Tag: lua与虚拟机 | skynet
云风 发于 2015年12月18日 16:08 | 点击: 823 | 展开摘要
skynet 本质上只是一个消息分发器,以服务为单位,给每个服务一个独立的 id ,可以从任意服务向另一个服务发送消息。

在此基础上,我们在服务中接入 Lua 虚拟机,并将消息收发的 api 封装成 lua 模块。目前用 lua 编写的服务在最底层只有一个入口,就是接收并处理一条 skynet 框架转发过来的消息。我们可以通过 skynet.core.callback (这是一个内部 API ,用 C 编写,通常由 skynet.start 调用)把一个 lua 函数设置到

查看全文: http://www.udpwork.com/item/14864.html

+0  扩展 lua require 的行为

Tag: lua与虚拟机
云风 发于 2015年10月26日 21:14 | 点击: 641 | 展开摘要
今天同事提了个需求,他希望可以给部分 lua 代码(由策划编写)做一个沙盒关起来。在 lua 里做沙盒很容易,只需要控制函数的环境就可以了。不过另一个附加需求是,这些代码还可以直接利用 require 加载。

而我们又不想去修改系统的 api 接口,那么怎么做到这点呢?

首先, 我希望使用的时候看起来像这样:

local xxx = require "xxx" (myEnv)

和传统的 require 用法不同,可以在后面追加一个参数 myEnv 。这样的话,每次

查看全文: http://www.udpwork.com/item/14706.html

+0  共享 lua vm 间的小字符串

Tag: lua与虚拟机 | skynet
云风 发于 2015年08月21日 16:26 | 点击: 687 | 展开摘要
lua 中 40 字节以下的字符串会被内部化到一张表中,这张表挂在 global state 结构下。对于短字符串,相同的串在同一虚拟机上只会存在一份。

在 skynet 中,有大量的 lua vm ,它们很可能加载同一份 lua 代码。所以我之前改造过一次 lua 虚拟机,[让它们可以共享 Proto] 。这样可以加快多个虚拟机初始化的速度,并减少一些内存占用。

但是,共享 Proto 仅仅只完成了一半的工作。因为一段 lua 代码有一很大一部分包含了很多字符串常量。而

查看全文: http://www.udpwork.com/item/14528.html
|<<<1234567>>>| 一共7页, 82条记录