作者:shihuaping0918@163.com,转载请注明作者
两个月前接触skynet,最初使用的时候过程是相当痛苦的,而且网络上可以找到的学习资料并不多。当时决定写一些skynet相关的文章,最近终于有空了,开始写这个东西。
skynet是云风开源的一个游戏框架,底层是c,中间层和上层都是lua。基于actor模型,使用消息队列进行内部通信。万丈高楼平地起,先开始看最底层的内容吧,因为上层的会涉及一些业务,而最底层的只涉及一些系统调用,理解起来更简单。
阅读代码使用的工具是eclipse cdt。代码提交tag是f94ca6f
skynet底层代码位于skynet/skynet-src下,模块加载相关在skynet-module.c skynet-module.h这两个文件里。这里的模块在linux下指的是so,在windows下指的是dll,在skynet中指的是config中配置的cpath下的文件。
//以下四行为函数指针声明
typedef void * (*skynet_dl_create)(void);
typedef int (*skynet_dl_init)(void * inst, struct skynet_context *, const char * parm);
typedef void (*skynet_dl_release)(void * inst);
typedef void (*skynet_dl_signal)(void * inst, int signal);
//单个模块的结构体
struct skynet_module {
const char * name; //模块名
void * module; //模块指针
skynet_dl_create create; //create函数
skynet_dl_init init; //init函数
skynet_dl_release release; //release函数
skynet_dl_signal signal; //signal函数
};
//添加一个模块
void skynet_module_insert(struct skynet_module *mod);
//查询一个模块
struct skynet_module * skynet_module_query(const char * name);
//某个模块中的create函数调用
void * skynet_module_instance_create(struct skynet_module *);
//某个模块中的init函数调用
int skynet_module_instance_init(s