摘要:最近在使用skynet的过程中,遇到需要为玩家的每次请求产生一个随机序列的场景。简化如下: main.lua中每隔1S便发出一次随机数请求: testrand.lua: 开发时使用的是skynet-mingw版本,测试结果如下: 可以看到,出现了很多重复的随机数,失去了随机的效果。经测试发现,如果在
阅读全文
摘要:我从开源项目(https://github.com/lipp/lua-websockets,这里我们简称LWS)中抽出了websocket的部分处理,步骤如下: 1)首先是解决LWS的几个依赖问题。LWS在握手阶段的base64编解码使用了luasocket中的mime,因此在3rd文件夹中建立mi
阅读全文
摘要:在使用skynet开发时,你也许会碰到类似这样的警告:A message from [ :0100000f ] to [ :0100000a ] maybe in an endless loop (version = 137) 它表示你的代码在某处陷入了死循环。但是如何找到死循环的点呢?可以这样做:
阅读全文
摘要:相比于上节我们提到的协程调度,skynet的线程调度从逻辑流程上来看要简单很多。下面我们就来具体做一分析。首先自然是以skynet_start.c为入口: 先是创建monitor、timer、socket三个线程分别执行监控、计时器、网络处理的工作,接着创建thread个用户线程,设置权重weigh
阅读全文
摘要:注:为方便理解,本文贴出的代码部分经过了缩减或展开,与实际skynet代码可能会有所出入。 作为一个skynet actor,在启动脚本被加载的过程中,总是要调用skynet.start和skynet.dispatch的,前者在skynet-os中做一些初始化工作,设置消息的Lua回调,后者则注册针
阅读全文
摘要:昨天和三石公聊天,他提到timer的实现原理,我当时迟疑了一下,心想timer不是系统底层时钟中断驱动上层进程/线程,累积计时实现的么?他简述了timer的实现,什么堆排序,优先级队列等,与我想象的不同。正好这两天在作skynet笔记,以前也没有留意过skynet的timer,这次干脆就看看它是怎么
阅读全文
摘要:继上一篇介绍了skynet的网络部分之后,这一篇以网关gate.lua为例,简单分析下其串接和处理流程。 在官方给出的范例中,是以examples/main.lua作为启动脚本的,在此过程中会创建watchdog服务: 首先加载watchdog.lua脚本。而在watchdog.lua的加载过程中,
阅读全文
摘要:先来看下socket_server的数据结构,这里简称为ss: 我绘了一张简图,表述网络收发部分的处理流程,如下: 1)skynet启动时会创建单独的socket线程,在这个线程中,通过skynet-socket-poll轮循管道server-pipe。ss.sendctrl_fd是管道的写端,而s
阅读全文
摘要:阅读skynet的lua-c交互部分代码时,可以看到如下处理: 那么,问题来了:skynet_context是如何作为upvalue与C函数绑定在一起的呢?这里以luaopen_skynet_core(lua_State *L)为例: 这里先通过luaL_newlibtable创建一张表T(函数指针
阅读全文