April 23, 2014

简悦 QC 招聘

由于我们公司 简悦 在移动平台游戏业务的发展需要,现在想招聘 QC 一名。

工作职责:

负责网络游戏的测试,包括:

  • 协助策划保证游戏设定的合理性;
  • 制定测试计划和方案,完成测试用例;
  • 执行测试过程,并跟进缺陷;
  • 推进开发和测试流程的的持续改进;
  • 配合项目组解决工作中遇到的问题,并能对项目组提出合理化建议。

工作要求:

  1. 理工科专业,本科以上学历(计算机相关专业尤佳);
  2. 2年以上游戏测试经验(具备手游测试经验者优先);
  3. 熟悉项目开发流程、测试流程,熟练掌握各种测试技巧,熟悉测试用例及测试文档,测试报告的编写;
  4. 具备一定的编程能力,有一定的自动测试工具的研发或二次开发经验;
  5. 具备较强的逻辑分析及学习能力,有良好的团队合作意识,有强烈的责任心和积极主动的工作态度,较强的沟通能力和表达能力;
  6. 热爱网游,具备丰富的游戏经验,对游戏有自己的思考和见解

如果具备以下经验更佳:

  1. 熟悉iPhone或Andriod手机平台的测试工作,对移动终端游戏玩法或测试方法有一定经验
  2. 对手机客户端的功能,性能,中断等测试内容有一定经验
  3. 有一定的自动化测试脚本编写经验, 熟悉服务器端性能测试方法

阅读全文 "简悦 QC 招聘" »

Skynet 发布第一个正式版

距离 skynet 开源项目的公布 已经有 20 月+ 了,如果从闭源阶段算起,已经超过了 30 个月。在我们公司内部有五个项目使用 skynet 开发,据有限的了解,在我们公司之外,至少有两个正式项目使用了相当长的时间。是时候发布一个正式版了。

今天 skynet 的第一个正式版本 v0.1.0 发布了。

在发布之前,我花了几天时间帮助公司内部的项目合并代码。最后全部统一使用这个版本。而在此之前,每个项目都是由一个负责人 fork 出一份,根据项目需要自己修改。merge 工作总是做的痛苦不堪。

通过这次发布,希望未来可以统一维护基础框架部分。

阅读全文 "Skynet 发布第一个正式版" »

April 17, 2014

skynet 的 snax 框架及热更新方案

skynet 目前的 api 提供的偏底层,由于一些历史原因,某些 api 的设计也比较奇怪。(比如 skynet.ret 是不对返回数据打包的)

我想针对一些最常见的应用环境重新给出一套更简单的 api ,如果按固定模式来编写 skynet 的内部服务会简单的多。

这就是这两天实现的 snax 模块。今天我已经将其提交到 github 的 snax 分支上,如果没有明显的问题,将合并入主干。

snax 仅解决一个简单的需求:编写一个 skynet 内部服务,处理发送给它的消息。snax 并不会取代 skynet 原有的 api ,只是方便实现这类简单需求而已。

阅读全文 "skynet 的 snax 框架及热更新方案" »

April 15, 2014

对 skynet 的 gate 服务的重构

由于历史原因,skynet 中的 gate 服务最早是用 C 写的独立服务。后来 skynet 将 socket 的管理模块加入核心后又经历过一次重构,用后来增加的 socket api 重新编写了一遍。

目前,skynet 的各个基础设施逐步完善,并确定了以 lua 开发为主的基调,所以是时候用 lua 重写这个服务了。

如果是少量的连接且不关心性能的话,直接用 skynet 的 lua socket 库即可。这里有一个例子

gate 定位于高效管理大量的外部 tcp 长连接。它不是 skynet 的核心组件,但对于网络游戏业务,必不可少。

阅读全文 "对 skynet 的 gate 服务的重构" »

April 02, 2014

lua-conf 让配置信息在不同的 lua 虚拟机间共享

有时候我们的项目需要大量的配置表(尤其是网络游戏) 。因为主要用 lua 做开发,我们倾向于直接用 lua table 保存这些配置常量。

海量的数据有两个问题:

这些配置数据在运行期是不变的,但树型结构复杂,放在 lua 虚拟机内会生成大量的 gc object ,拖慢 lua 的垃圾收集器。因为每次扫描都需要把所有配置数据都标记一遍。

在服务器端,我们使用 skynet 框架,会启动数千个 lua 虚拟机。如果每个虚拟机都加载一份配置信息,会带来大量的内存浪费。

阅读全文 "lua-conf 让配置信息在不同的 lua 虚拟机间共享" »

April 01, 2014

内存安全的 Lua api 调用

Lua 的 API 设计的非常精良,整个 lua 核心库把内存管理都托管给了 lua_Alloc 这个用户注入的函数。任何时候在发生内存不足,lua 的 api 都可以正确处理异常。

考虑一下 lua_newtable 或是 lua_pushlstring 这些 api ,它们都需要创建新的 gcobject ,这些时候如果发生 lua_Alloc 分配不出内存怎么办?这些 api 可都是无返回值的。

lua 的行为是:抛出一个内存错误,如果外界没能捕获这个错误,则触发 panic 函数。

在编写将 lua 嵌入到宿主程序中的一个常见的错误是:

先用 lua_newstate 创建出一个 lua 虚拟机,然后直接调用 luaL_openlibs 等函数初始化它。如果你希望你的代码足够严谨,就必须了解,初始化的过程是有可能遇到内存申请不到的情况的。

正确的做法在 lua 自带的解释器实现中有一个很好的范例:你可以写一个 lua c function ,在里面做后续对 lua_State 的操作。在 lua_newstate 后,立刻 lua_pcall 这个 C 函数,而不是直接调用它。这样,所有的内存异常都会被这次 pcall 捕获住。

btw, 早期版本的 lua 有一个 lua_cpcall 函数,自从 lua 支持 light c function 后就去掉了这个 api 。

阅读全文 "内存安全的 Lua api 调用" »

March 27, 2014

在不同的 lua vm 间共享 Proto

在 skynet 这种应用中,同一个系统进程里很轻易的就会创建数千个 lua 虚拟机。lua 虚拟机本身的开销很小,在不加载任何库(包括基础库)时,仅几百字节。但是,实际应用时,还需要加载各种库。

在 lua 虚拟机中加载 C 语言编写的库,同一进程中只会存在一份 C 函数原型。但 lua 编写的库则需要在每个虚拟机中创建一份拷贝。当有几千个虚拟机运行着同一份脚本时,这个浪费是巨大的。

我们知道,lua 里的 function 是 first-class 类型的。lua 把函数称为 closure ,它其实是函数原型 proto 和绑定在上面的 upvalue 的复合体。对于 Lua 实现的函数,即使没有绑定 upvalue ,我们在语言层面看到的 function 依然是一个 closure ,只不过其 upvalue 数量为 0 罢了。

btw, 用 C 编写的 function 不同:不绑定 upvalue 的 C function 被称为 light C function ,可视为只有原型的函数。

如果函数的实现是一致的,那么函数原型就也是一致的。无论你的进程中开启了多少个 lua 虚拟机,它们只要跑着一样的代码,那么用到的函数原型也应该是一样的。只不过用 C 编写的函数原型可以在进程的代码段只存在一份,而 Lua 编写的函数原型由于种种原因必须逐个复制到独立的虚拟机数据空间中。

阅读全文 "在不同的 lua vm 间共享 Proto" »

Misc

Categories

Archives

Recent Comments