公司的游戏服务器,业务逻辑层使用了Lua, 宿主语言使用了c/c++。其中每一个独立的服务,例如对mongo的访问封装,对mysql的访问封装,都创建独立的lua虚拟机,其实表现就是独立的so动态链接库文件。
lua引擎层对协程做了一些封装,对外表现为执行队列,每一个玩家,开创一个协程,c++的网路接受层,和通常的游戏服务器相同,也是数据包驱动,模式是单线程多协程, 主线程处理网络请求,接收到数据拆包之后,找出该数据包对应的协程去处理。所以这一块,会由数据来驱动协程的分发器。
其实从这里可以看出来,对于io部分,无论是网络io还是数据库io,都是交由c/c++层来实现, 而lua层,主要是用来做cpu相关的运算。
在lua源码中,所谓的协程,就是Lua_state,里面大量的函数接口都是lua_state,再lua底层的管理中,thread类型是数据类型中的一种,所以协程的销毁是遵循gloal_state的GC管理。而协程,其实可以理解为栈, 包含函数栈和数据栈, 这组成了一个执行环境。