最新 | 最热门 | 最高评价

+0  sproto 的一些更新

Tag: skynet | 语言与设计
云风 发于 2017年03月14日 22:05 | 点击: 405 | 展开摘要
sproto 是我设计的一个类 google protocol buffers 的东西。

在很多年前,我在我经手的一些项目中使用 google protocol buffers 。用了好几年,经历了几个项目后,我感觉到它其实是为静态编译型语言设计的协议,其实并没有脱离语言的普适性。在动态语言中,大家都不太愿意使用它(json 更为流行)。一个很大的原因是,protobuffers 是基于代码生成工作的,如果你不使用代码生成,那么它自身的 bootstrap 就非常难实现。

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

+0  跟踪数据结构的变更

Tag: lua与虚拟机 | 语言与设计
云风 发于 2017年02月14日 18:01 | 点击: 421 | 展开摘要
这两个月,我的主要工作是跟进公司内一个 MMORPG 项目,做一些代码审查提出改进意见的工作。

在数月前,项目经理反应程序不太稳定,经常出一些错误,虽然马上就可以改好,但是随着开发工作推进,不断有新的 bug 产生。我在浏览了客户端的代码后,希望修改一下客户端的 UI 框架以及消息分发机制等,期望可以减少以后的 bug 出生概率。由于开发工作不可能停下来重构,所以这相当于给飞行中的飞机换引擎,做起来需要非常小心,逐步迭代。

工作做了不少,其中一个小东西我觉得值得拿出来写写

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

+0  一个简单的 lua 对象回收再利用方案

Tag: lua与虚拟机 | 语言与设计
云风 发于 2017年01月24日 10:36 | 点击: 556 | 展开摘要
昨天在 review 我公司一个正在开发的项目客户端代码时,发现了一些坏味道。

客户端框架创建了一个简单的对象系统,用来组织客户端用到的对象。这些对象通常是有层级关系的,顶层对象放在一个全局集里,方便遍历。通常,每帧需要更新这些对象,处理事件等等。

顶层每个对象下,还拥有一些不同类别的子对象,最终成为一个森林结构,森林里每个根对象都是一颗树。对象间有时有一些引用关系,比如,一个对象可以跟随另一个对象移动,这个跟随就不是拥有关系。

这种设计方法或模式,是非常常见的。但是在

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

+0  ephemeron table 对 property tables 的意义

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

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

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

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

+0  基于引用计数的对象生命期管理

Tag: skynet | 语言与设计
云风 发于 2016年01月06日 16:32 | 点击: 597 | 展开摘要
最近在尝试重新写 skynet 2.0 时,把过去偶尔用到的一个对象生命期管理的手法归纳成一个固定模式。

先来看看目前的做法:旧文 对象到数字 ID 的映射

其中,对象在获取其引用传入处理函数中处理时,将对象的引用加一,处理完毕再减一。这就是常见的基于引用计数的对象生命期管理。

常规的做法(包括 C++ 的智能指针)是这样的:对象创建时,引用为 1 (或 0)。每次要传给另一个处地方处理,或保留待以后处理时,就将其引用增加;不再使用时,引用递减。当引用减为 0 (或负

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

+0  RPC 之恶

Tag: skynet | 语言与设计
云风 发于 2015年12月05日 00:07 | 点击: 603 | 展开摘要
起因是最近有人在 skynet 邮件列表里贴了段错误 log ,从 log 显示,他在 table.sort 的比较函数里调用了 skynet 的 snax rpc 去获取远程数据。然后被 lua 无情的报了 attempt to yield across a C-call boundary 。

就 table.sort 不能 yieldable 的问题,其实在 lua 邮件列表里讨论过 。老大的说法是,这个 C 实现是递归的,想要在 C 层面保留上下文非常困难,如果勉强实

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

+0  RPC 之恶

Tag: skynet | 语言与设计
云风 发于 2015年11月30日 15:29 | 点击: 570 | 展开摘要
起因是最近有人在 skynet 邮件列表里贴了段错误 log ,从 log 显示,他在 table.sort 的比较函数里调用了 skynet 的 snax rpc 去获取远程数据。然后被 lua 无情的报了 attempt to yield across a C-call boundary 。

就 table.sort 不能 yieldable 的问题,其实在 lua 邮件列表里讨论过 。老大的说法是,这个 C 实现是递归的,想要在 C 层面保留上下文非常困难,如果勉强实

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

+0  sproto rpc 的用法

Tag: 语言与设计
云风 发于 2015年04月27日 11:46 | 点击: 917 | 展开摘要
sproto 是我自己设计, 用在我们新项目中取代过去用到的 google protocol buffers 的东西。

为什么不用 protobuf ? 这个问题我有足够的发言权。在 lua 语言为主的项目中,sproto 更合适。google 官方并没有给 protobuf 加入 lua 支持。现在在网上流传的 protobuf lua 方案,被人用的最多的两种,一个是 pbc 的 lua binding ,另一个是 protoc-gen-lua 。前者是我在开发维护,

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

+0  给 sproto 增加 unordered map 的支持

Tag: 语言与设计
云风 发于 2015年04月20日 19:57 | 点击: 895 | 展开摘要
花了两天给 sproto 增加了 unordered map 的支持。

问题是这样的:

sproto 支持数组,但很多情况下,业务处理中,我们并不用数组来保存大量的相同类型的结构数据。因为那样不方便检索。

比如你要配置若干地图表、NPC 表等等的信息,固然可以用 sproto 的 array 来保存。但是在运行时,你更希望用定义好的 id 来检索它们。如果 sproto 不支持 unordered map 的话,你就需要在 decode 之后,对 array tabl

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

+0  ejoy2d shader 模块改进计划

Tag: 语言与设计
云风 发于 2014年09月21日 20:55 | 点击: 854 | 展开摘要
由于有公司很多同事参与 ejoy2d 的开发,所以 ejoy2d 这个项目已经转移到 ejoy 的 github 名下。

有更多项目的参与的情况下,原来 ejoy2d 的简单构架慢慢显出一些局限性。主要是不同的项目会根据项目的需要(通常是针对某些特定需求的优化,以及特别的效果需求)修改底层 shader 的部分。最早设计的时候,因为考虑到只是用于 2d 游戏的开发,所以把 shader 模块实现的比较简单。特别是 attribute layout 是固定的,而 unif

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

+0  STM 的简单实现

Tag: skynet | 语言与设计
云风 发于 2014年08月12日 15:38 | 点击: 929 | 展开摘要
STM 全称 Software transactional memory 。

在前年的项目里,我制作了一个类似的东西。随着 skynet 的日趋完善,我希望找到一个更为简单易用的方法实现类似的需求。

对于不常更新的数据,我在 skynet 里增加了 sharedata 模块,用于配置数据的共享。每次更新数据,就将全部数据打包成一个只读的树结构,允许多个 lua vm 共享读。改写的时候,重新生成一份,并将老数据设置脏标记,指示读取者去获取新版本。

这个方案有两个缺点,不

查看全文: http://www.udpwork.com/item/12907.html
|<<<1234>>>| 一共4页, 46条记录