游戏服务端架构的思考

我从业游戏服务端有10年了,阶段性做个小结,总结我对游戏服务端的理解,这次就谈下服务端架构以及如何优化。文章就以我的经历作为开头。

写在开头

10年前,我加入了一家pc端的游戏公司,那时候国内端游已经是走向没落的时候了,公司正在开发的游戏是mmorpg,玩法比较像魔兽世界,这款游戏他们在此之前已经开发5年了,导致美术资源在当时看来比较落后了,不像同期火热的页游美术那么精致。

但是我觉得,像魔兽世界这种游戏,玩家大地图的游走和打怪,不同职业的配合和牵制,玩家与玩家之间亲密的合作、激烈的对抗是能补足美术这点不足的,特别是巡游boss,一个肉盾抗几下就挂了,基本需要10-20人通力合作才能把 boss 打死。

很快,大量玩家来玩这个游戏,以及客服收集到的评价验证了我的想法。可令人没想到的是,开发问题很大,这个游戏上线期间每天都有1-2次进程崩溃,玩家数据回档。

很可惜,我不是这个项目的开发,我不了解这个游戏的架构,只是这件事在我的心里埋下了种子,让我萌生想要解决问题的想法。
继续阅读游戏服务端架构的思考

lua table # 取长度问题

任何语言都不是完美无瑕的,在使用中都有各种问题,lua 也不例外。而 lua 使用中,绝对绕不开的一个问题就是 # 取 table 长度问题。

问题描述

先看下 # 的一些使用情况,希望引起你的困惑:

> t = {1,1,nil,1}
> #t
4
> t = {nil,nil,1,nil}
> #t
0
> t = {1,nil,nil,nil,nil,nil,nil,1}
> #t
8
> t[9] = 1
> #t
1
> t = {1,nil,nil,nil,nil,nil,nil,1,1}
> #t
9

当 table 有部分值为 nil 时,你很难清楚 # 取得的结果是什么。(如果你想知道 table 实际长度,只能遍历 table)
继续阅读lua table # 取长度问题

lua定位CPU100%问题

在开始这个话题前,说下我遇到的 skynet 进程 CPU100% 占用问题,查找 bug 的过程比较繁琐,后来想到做改进,这也是促成我写这篇文章的原因。

查到是一段 lua 代码有问题,这里截取其中出问题的代码:

-- 活动开始时间: 2033-01-01 00:00:00
local start_time = 1988121600

function start_activity()
    local now = os.time()
    local diff = now - start_time
    if diff < 0 then
        skynet.timeout((-diff)*100, start_activity)
        return
    end

    -- todo 省略活动内容
end

以上代码,通过 skynet.timeout 设置定时器,定时触发 start_activity , 看似没有问题,但是,当 skynet.timeout 第一个参数过大时,会有意想不到的收获。
继续阅读lua定位CPU100%问题

skynet 编译问题总结

原文 2015-09-23 23:48:54 发表于 CSDN,这里对以前写的文章做下收录。

skynet 下载编译过程对系统环境有很大依赖性,编译说明过于简单,没有提及到。所以,文章这里总结 skynet 比较常见的编译问题,希望有所帮助。

skynet 的编译过程:

git clone https://github.com/cloudwu/skynet.git
cd skynet
make linux

简单3步,对于很多高版本的系统来说,可能就这3步。但是,低版本系统可能无法编译,如下:
1. gcc 版本问题
2. 缺少 readline
3. 缺少 ncurses
4. 缺少 git (非必要项,则要手动下载skynet及3rd下的jemalloc)
5. 缺少 autoconf 等等
继续阅读skynet 编译问题总结

skynet 控制台使用技巧

原文 2016-01-07 01:14:27 发表于 CSDN,这里对以前写的文章做下收录。

skynet 自带了一个控制台服务,可以很方便获取和调试 skynet 运行数据,而且可以热更新代码,所以,弄明白 skynet 控制台管理可以让你更好地使用 skynet,甚至改进这个控制台服务,以满足不同业务需求。

这个服务默认不会启动,需要你手动启动它,如下:
skynet.newservice("debug_console", 8000)

设计原因,调试控制台只监听本地地址 127.0.0.1 ,如果需要远程使用,需要先登录到本机,然后再连接。

使用时,通过 telnet 或 nc 登录调试控制台,启动后显示:

$ nc 127.0.0.1 8000
Welcome to skynet console

表示连接成功。
继续阅读skynet 控制台使用技巧