February 11, 2015

在线调试 Lua 代码

一直有人问,如果调试 skynet 构件的服务。

我的简单答案是,仔细 review 代码,加 log 输出。长一点的答案是,尽量熟悉 skynet 的构造,充分利用预留的监控接口,自己编写工具辅助调试。

之前的好多年,我也写过很多 lua 的调试器,这里就不一一翻旧帖了。今天要说的是,我最终还是计划加入 1.0 正式版的调试控制台。

也就是单步跟踪调试单个 lua coroutine 的能力。这对许多新手来说是个学走路的拐杖,虽然有人一辈子都扔不掉。

阅读全文 "在线调试 Lua 代码" »

February 10, 2015

怎样在运行时插入运行一段 Lua 代码

最近想给 skynet 加一个在线调试器,方便调试 Lua 编写的服务。

Lua 本身没有提供现成的调试器,但有功能完备的 debug api 。通常、我们可以在代码中插入 debug.debug() 就可以进入一个交互环境,输入任何 Lua 指令。当然,你也可以在 debug hook 里调用它。

但这种交互方式有一个缺点:lua 直接用 load 翻译输入的文本,转译为一个 lua 函数并运行。这注定了这个输入的代码中不能直接访问到上下文的局部变量和 upvalue 。

如果想读写上下文中的局部变量或 upvalue ,还得使用 debug.getlocal 等函数。这无疑是相当麻烦的。

阅读全文 "怎样在运行时插入运行一段 Lua 代码" »

January 30, 2015

Lua 5.3 升级注意

最近在慢慢把公司的几个项目从 Lua 5.2 迁移到 Lua 5.3 ,为发布 skynet 1.0 alpha 版做准备。

在更新代码时发现了一些注意点,罗列一下:

Lua 5.3 去掉了关于 unsigned 等的 api ,现在全部用 lua_Integer 类型了。这些只需要换掉 api ,加上强制转换即可。通常不会有什么问题。

最需要细致 review 代码升级的是和序列化相关的库。在 skynet 里是序列化库、sproto、bson 等。我们还用到了 protobuffer ,也和序列化有关。

这是因为,Lua 5.3 提供了整型支持,而序列化工作通常需要区分浮点和整数分开处理。json 这种文本方式则不需要,同样还有 redis 的通讯协议也是如此。

过去判断一个 number 是浮点还是整数,需要用 lua_tonumberlua_tointeger 各取一份做比较。虽然到了 Lua 5.3 这种代码理论上可以不用改动,但正确的方法应该是使用 lua_isinteger

阅读全文 "Lua 5.3 升级注意" »

January 18, 2015

Lua 5.3 中文手册

一边在群里嘻嘻哈哈扯淡,一边翻译着 Lua 5.3 的中文手册。这项工作终于在本周内完成了。

http://cloudwu.github.io/lua53doc 这里可以在线浏览。

得益于强大的 github ,让我可以专注于翻译,而不用在意打字太快造成的各种错别字。这使得翻译工作进行得很流畅。只花了 6 天就完成了 350K html 文本,大约六万汉字的翻译工作。中间还出去跟人吃了个饭、打了一晚上 XCOM ,去岩馆抱了石,回了好些 email ,在群里各种吐槽,以及给 ejoy2d 做了点优化工作。

当然,整个过程并不算轻松。我一天写 2000 行代码时,都没打字到指头酸痛过。

有很多同学帮着做校对。每天中午起床后,只需要合并一下错别字修改的 PR 即可。这里一并感谢你们。你们的名字及贡献永远留在 github 仓库里了:)

如果你在阅读过程中发现什么问题,也可以 fork 这个仓库 ,改好 pull request 即可。

January 13, 2015

Lua 5.3 正式发布以及文档翻译计划

Lua 5.3 正式发布了。

我的三个计划就需要开动了。

计划一:把文档重新翻译一遍。

八年前,我翻译了 Lua 5.1 的中文手册。今天我想再从头做一次翻译工作,借这个机会可以理一遍(以及更新)和 Lua 相关的知识。这次,我选择在 github 上做这个工作,而不是闷头搞完了再发布。

这个项目在 https://github.com/cloudwu/lua53doc ,如果你只是想阅读最终的手册,可以访问这里。如果发现了错别字,不用给我留言,你只需要在 github 上提个 PR ,我会合并的。

今天下午开始的,目前译完了 readme目录页、和正文的很少一部分。我估计需要全职至少 3 个工作日才能全部译完。这次我选择尽量把英文术语翻译成中文,对于我按个人喜好选择的译词,我专门列在一个页面中。

阅读全文 "Lua 5.3 正式发布以及文档翻译计划" »

January 08, 2015

如何拼接 PVR 压缩贴图

2d 游戏通常都用到很多图素,由于显卡硬件特性,我们又不会把单个图素放在独立贴图中。这样会导致渲染批次过多。在移动设备上,非常影响渲染效率。

所以,游戏运行时,这些图素一般都会合并在很少几张贴图上。要么采用离线合并的方式(利用 texture packer 这样的工具),或者在运行时使用装箱算法。

最近,朱光同学一直在为 ejoy2d 编写运行时合并图素的模块。今天我们讨论了一下他做的诸多尝试。

阅读全文 "如何拼接 PVR 压缩贴图" »

为什么 skynet 提供的包协议只用 2 个字节表示包长度

skynet 提供了一个 lua 库 netpack ,用来把 tcp 流中的数据解析成 长度 + 内容的包。虽然使用 skynet 的同学可以不使用它,而自己另外实现一套解析协议来解析外部 TCP 数据流(比如 skynet 中的 redis driver 解析 redis server 的数据流就是用的换行符分割包),但依然有很多同学询问,能不能自定义包头长度。

这里的这个库定义的协议中,包长度是用 big-endian 的 2 个字节表示的,也就是说一个包的长度不得超过 64K 。这让很多人很为难。已经几次有同学建议,把长度放宽成 4 个字节,因为他们的应用环境中大部分包不会超过 64K ,但总有少量超过这个限制的。

阅读全文 "为什么 skynet 提供的包协议只用 2 个字节表示包长度" »

Misc

Categories

Archives

Recent Comments