这周花了点时间看了 skynet 关于定时器功能的源码,以及扩展的了解了一下定时器实现的其他方案,写一遍博客总结一下.内容会分为下面几部分:

首先确定定时器里面的几个概念:
tick: 指 skynet timer 线程每一次处理事件的循环.由于这个循环每隔 0.00025 秒会执行一次,很像时钟滴答滴答的走,很多书籍都称为 tickskynet 启动时间戳: 顾名思义,比如 1528613417 时间戳(北京时间 2018/6/10 14:50:17)代表 skynet 是这个时间点启动的,而且这个时间是不会变的.这个比较容易理解系统启动时间数: 单位 0.01 秒. 顾名思义,但是为什么说是时间数呢?因为这是一个时间的量,比如300,表示系统启动了3秒. skynet timer 线程在每一次 tick 都会去同步这个时间量skynet 启动时间数: 单位 0.01 秒. 与系统启动时间数类似,如 300,表示 skynet 启动了 3 秒,每次 tick skynet timer 线程也会去更新这个时间量首先需要说明的是, skynet 定时器的时间刻度是百分秒(0.01秒).意味着 skynet 最小可以定义事件 0.01 秒后执行.这个精度对于游戏领域可以说是够用了.
skynet 初始化时会创建5个定时器的事件槽,分别是 Near,level0-3.每个定时器事件是按照触发时间(这个触发时间是以 skynet 启动时间数作为参照的.比如触发时间为 300,事件注册时 skynet 创建时间量为 100,表示注册这个事件在 2 秒后执行)为索引插入到对应的槽里面的.用索引的方式安排这些事件保证了查询和插入的性能( 时间复杂度为O(1) ).
这个星期以来,由于工作需要使用skynet,于是看了5天skynet的源码。收获很多,于是周末写篇博文总结一下这周以来的学习。
这5天的学习过程可以概括为5句话:(因为5天嘛)
看了5天后回过头来发现,其实了解的还停留在skynet的核心部分,还没有走出核心。因为skynet还包含很多其他内容,比如他的消息机制的各种api、socket支持、loginserver gateserver、datacenter、harbor等等。。。
不过问题也不大,毕竟核心比较重要,后续还要继续学习。
那下面就来总结一下这5天都看到来什么内容。有可能因为我了解尚浅,写出来的和实际的skynet有出入。不过没关系,后续会回过头来再看看。
下面的总结会按照这个结构:
那么,开始吧。
可以用一个段落来说明
$ ll
drwxr-xr-x 26 root staff 884 6 1 06:30 .
drwxr-xr-x 5 root staff 170 6 2 07:07 ..
drwxr-xr-x 12 root staff 408 6 1 07:10 .git
-rw-r--r-- 1 root staff 94 6 1 05:36 .gitignore
-rw-r--r-- 1 root staff 96 6 1 05:36 .gitmodules
drwxr-xr-x 8 root staff 272 6 1 22:25 .idea
drwxr-xr-x 6 root staff 204 6 1 05:36 3rd -- 第三方c库目录,如lua jmalloc
-rw-r--r-- 1 root staff 12384 6 1 05:58 CMakeLists.txt
-rw-r--r-- 1 root staff 11953 6 1 05:36 HISTORY.md
-rw-r--r-- 1 root staff 1085 6 1 05:36 LICENSE
-rw-r--r-- 1 root staff 3484 6 1 05:36 Makefile
-rw-r--r-- 1 root staff 1085 6 1 05:36 README.md
drwxr-xr-x 7 root staff 238 6 1 05:58 cmake-build-debug
drwxr-xr-x 10 root staff 340 6 1 05:39 cservice -- 可被skynet核心加载的so动态库服务
drwxr-xr-x 33 root staff 1122 6 1 05:36 examples -- skynet提供的一些lua逻辑的例子
drwxr-xr-x 14 root staff 476 6 1 05:39 luaclib -- 可被lua加载的skynet so库
drwxr-xr-x 12 root staff 408 6 1 07:10 lualib -- lua skynet库
drwxr-xr-x 22 root staff 748 6 1 05:55 lualib-src -- ./luaclib 里的so库的源文件
-rw-r--r-- 1 root staff 876 6 1 05:36 platform.mk
drwxr-xr-x 23 root staff 782 6 1 06:57 service -- 可被skynet加载的lua服务
drwxr-xr-x 8 root staff 272 6 1 05:36 service-src - ./cservice 里的so文件的源文件
-rwxr-xr-x 1 root staff 343772 6 1 05:38 skynet -- skynet可执行文件
drwxr-xr-x 41 root staff 1394 6 1 05:36 skynet-src -- ./skynet 的源文件
drwxr-xr-x 3 root staff 102 6 1 05:38 skynet.dSYM
drwxr-xr-x 38 root staff 1292 6 1 05:36 test -- 单元测试文件
从文件目录分析可以看出,skynet这个框架的内容既包含了c语言的实现(主要是c语言),也包含了lua逻辑(一些配置部分,或者可以被替代或者修改的逻辑,如服务加载器launcher.lua的逻辑, 或skynet启动的逻辑bootstrap.lua)。