博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leaf源码分析(二)----skeleton
阅读量:4031 次
发布时间:2019-05-24

本文共 1828 字,大约阅读时间需要 6 分钟。

本文公众号文章链接为:

 

 

 

Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。

 

skeleton是其中最重要的骨架。其封装了异步操作。包括chanrpc,time,go。

将其分为层次的话,就见下图

 

 

 已经讲解了chanrpc的用法

下面一个一个分析

 

g

Go模块是对golang中go提供一些额外功能。Go提供回调功能,LinearContext提供顺序调用功能。

github.com/name5566/leaf/go/go.go

1、Go

chancb:用于传送call back函数

pendingGo:用于记录正在处理go的计数器

 

初始化,其中l为容量值,关乎到chancb的容量

 

1、pengdingo:加1,记录调用计数

2、开了一个协程,执行了f

3、defer中,将回调函数cb发送到了chancb中

那是在哪里从chancb中取出cb的呢? 

看下skeleton中的处理部分

 

在skeleton中,会详细再介绍。

 

继续看源码

 

执行cb,并将pengdingo减1,说明整个过程完成了。pengdingo记录的就是整个过程。

 

close的时候,会等待所有的go得cb,并执行。

2、LinearContext

LinearContext提供顺序调用功能。其中利用list来顺序保存执行函数和回调函数

 

初始化,是从Go中生成的。就是必须先有Go,才能从Go中生成LinearContext

 

1、将需要执行的f函数和cb回调函数,防到list的最后

2、开协程,有锁,这里每次只能执行一个。执行的时候从list最前面取出来执行

3、执行完成之后,在defer中将cb发送给chancb。

 

过程和Go是类似的,但这里加了锁和list,所以能够保证执行顺序。

 

timer

Timer主要是提供一个Cron功能的定时器服务,其中Timer是time.AfterFunc的封装,是为了方便聚合到Skeleton中。

github.com/name5566/leaf/timer/timer.go

 

 

数据结构Timer,封装了标准库中的Timer,加上一个回调函数cb

 

Stop接口,将t停掉,并将cb赋为nil

 

这里封装的只是调用cb

 

关键还是在这个

 

这里面封装了一个chan

 

其中l为chan的缓存容量。

 

定时功能还是用的标准库中的timer,但定时完之后的处理则是,将处理发送给Dispathcher的chan中

 

依旧看看在哪里会接收这个

在skeleton中,接收这个cb回调,并进行处理cb回调

 

 

再看看cron

 

上面的代码很简单

这里的主要地方在cb,cb里面嵌套了cb,这个就是实现cron的关键。

 

skeleton

终于到了skeleton了

github.com/name5566/leaf/module/skeleton.go

再看看skeleton的图

 

底层的chanrpc,go,time都讲过了

 

 

1、g:对应的是g.Go

2、dispatcher:对应的是timer.Dispatcher

3、ChanRPCServer,server,commandServer  对应的是chanrpc server

4、client:对应的是chanrpc client

 

初始化

各自有各自的容量参数

 

运行时候:从各自的chan中接收信息,并处理。这就是一个集中异步处理中心。

另外skeleton提供了一些对外的接口

 

time的AfterFunc

 

time的CronFunc

 

Go接口

 

LinearContext接口

 

异步的client调用,参数中有server,这个很重要

 

 

提供了chanrpc server的注册rpc函数接口

 

这里的console以后再分析

 

小结

skeleton是leaf中很重要的模块,担负着异步处理的功能。其分层封装也非常的到位。代码简洁不啰嗦。很赞。

 

 

龚浩华

月牙寂道长

QQ 29185807

2018年04月18日

如果你觉得本文对你有帮助,可以转发分享到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

最后感谢关注本人公众号。

如果想查看历史文章,可以点击公众号下方的按钮“历史文章”
或者点击公众号下方按钮“文章目录”获取所有文章的索引文件

 

你可能感兴趣的文章
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
部分笔试算法题整理
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>