May 19, 2015

卡通图片的压缩

昨天看到一个好玩的项目 https://github.com/nagadomi/waifu2x 可以将卡通图片高质量的放大到 2x ,比直接用普通过滤器放大效果好的多。我试了将那张小的卡通妹子不断迭代放大到 8 倍,效果依然是很不错的。

公司的程序群里,有同学提出,能不能把算法提取出来,用来做游戏资源图片的压缩。针对卡通类的图片,可以用很小的文件保存,在加载或安装时放大。我觉得有点意思,就做了一些研究。

阅读全文 "卡通图片的压缩" »

May 14, 2015

Lua C API 的正确用法

Lua 作为一门嵌入式语言,提供了完备的 C API 供 Lua 代码和宿主程序交互,当然,宿主语言最好是 C 或 C++ 。如果是其它语言,比如最近两年流行的在 mono 环境嵌入 Lua 另当别论。

正确将 Lua 嵌入是不太容易做对的事情,很多刚接触 Lua 的人都容易犯错误。好在做这种语言桥接工作都是项目开始阶段的设计者做的,不必人人学会,所以只要有熟悉 Lua 的人来搞,犯错误的危害不会太大。而且即使做的有问题,日后修改也比较容易。这篇 blog 主要就是谈谈,最容易做错的位置,和一些正确(但看起来麻烦)的实现方法。

最容易忽略的是 Lua 中 error 的处理。

Lua 中叫 error ,再其它语言中叫 exception ,后面姑且全部称为异常吧。

如果你认真读过 Lua 的手册。 就会发现,在所有 C API 那里,都注明了这个 API 是否会抛出异常。比方说 lua_tostring 就标注的是 [-0, +1, e] ,有可能抛出异常(是不是和你的直觉不同?);但 lua_pushlightuserdata 则不会。

Lua 的异常应该由 lua_pcalllua_resume 来捕获,所以当你调用 C API 的时候,应该确保在 C 的调用层次上,处于某次 lua_pcalllua_resume 中。所以,即使是常见的创建 Lua 虚拟机的简单几行代码,都有可能写错。比如:

lua_State *L = luaL_newstate();
if (L) {
  luaL_openlibs(L);
}

这样写就是考虑不周的。因为 luaL_openlibs(L) 可能抛出异常,这样便没有捕获它。

阅读全文 "Lua C API 的正确用法" »

May 12, 2015

sproto 的缺省值处理

sproto 由于主要供 lua 使用,是不能在协议定义中描述缺省值的。所有不编码的字段都呈现为 lua 中的 nil 。

注:这里还有个实现上的小问题。如果一个数组为空,也会呈现为 nil 而不是空表,所以应当注意处理。

我最近给 sproto 增加了一个新的 api ,可以为一类消息生成一个全部为缺省值的 table 。这样,使用者就可以方便把这个 table 作为别的 table 的 metatable 中的 index 方法了。相当于实现了原来在 protobuf 中的缺省值的特性。

只不过,缺省值不能主动定义。所有的 integer 缺省为 0 、boolean 缺省为 false 、string 缺省为空串、子类型为空表,并附加有一项 __type 为子类型的名字。无数据的数组也缺省为一个空表。

阅读全文 "sproto 的缺省值处理" »

April 30, 2015

ltask :用于 lua 的多任务库

写这个东西的起源是,前段时间我们的平台组面试了一个同学,他最近一个作品叫做 luajit.io 。面试完了后,他专门找我聊了几个小时他的这个项目。他的核心想法是基于 luajit 做一个 web server ,和 ngx_lua 类似,但撇开 nginx 。当时他给我抱怨了许多 luajit 的问题,但是基于性能考虑又不想放弃 luajit 而转用 lua 。

我当时的建议是,不要把 lua/luajit 作为嵌入语言而自己写 host 程序,而是想办法做成供 lua 使用的库。这样发展的余地要大很多,也就不必局限于用户使用 lua 还是 luajit 了。没有这么做有很多原因是设计一个库比设计一个 host 程序要麻烦的多,不过麻烦归麻烦,其实还是可以做一下的,所以我就自己动手试了一下。

Lua 的多任务库有很多,有兴趣的同学 可以参考一下 lua user wiki

阅读全文 "ltask :用于 lua 的多任务库" »

基于 skynet 的 MMO 服务器设计

最近,我们的合作方 陌陌 带了他们的一个 CP 到我们公司咨询一下 skynet 做 mmo 游戏项目中遇到的一些问题。因为他们即将上线一款 MMO ,在压力测试环节暴露了许多问题。虽然经过我们的分析,有很多问题出在他们的压力测试程序本身编写的 bug ,但同时也暴露出服务器的设计问题。

核心问题是,他们在实现 mmo 服务器时,虽然使用了 skynet 框架,但却把所有的业务逻辑都放在了同一个 lua 服务中,也就是一切都运行在一个 lua states 里。这样,几乎就没能利用上 skynet 原本想提供的东西。压力是一定存在的。

我花了一下午探讨了应该如何设计一个 MMO 的服务器。下面记录一下:

阅读全文 "基于 skynet 的 MMO 服务器设计" »

April 27, 2015

sproto rpc 的用法

sproto 是我自己设计, 用在我们新项目中取代过去用到的 google protocol buffers 的东西。

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

另外,在我的项目的副产品中,还有开源的 protobuffer 的 as3 库以及 erlang 库,都有许多用户。所以,我相信我对 protobuf 有足够长时间的使用经验以及对它有足够的了解。这也是放弃 protobuf 而转向自己设计的 sproto 的底气所在。

在这一篇 blog 中,不想讨论 protobuf 的优劣,只谈谈 sproto 中如何使用 rpc 的 api 。这是 sproto 的 api 文档中没有写明,而很多想用它的同学问起的问题。


阅读全文 "sproto rpc 的用法" »

April 13, 2015

Xenonauts 中文化计划

作为一个 X-COM 老系列的爱好者(1994 年开始一直玩了 3 年),新的官方重制版是满足不了我的。

Xenonauts 作为原作的精神继承者,我很喜欢。

本来这个游戏上手了以后是不太依赖文字的,只是可惜了它写的不错的文案。我在网上搜了一下汉化包,几乎都是机器翻译的,读那个真不如读英文啊。

游戏的官方没有能力做中文化,但是在官方论坛提供了翻译的指引

我按指引用文泉驿制作了游戏用的字体文件,发现游戏引擎本身对中文支持是没有什么问题的,差的只是文字翻译了。

但是这个游戏文字量极大,而且不太容易翻译。我在 github 上创建了一个项目,希望可以集众人之力来完成这个大工程。项目的地址在 https://github.com/cloudwu/xenonauts

阅读全文 "Xenonauts 中文化计划" »

Misc

Categories

Archives

Recent Comments