Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率 并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性:
* 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率
* 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃
* 多核支持。Leaf 通过模块机制和
* 良好的模块支持。
一个 Leaf 开发的游戏服务器由多个模块组成(例如
* 每个模块运行在一个单独的 goroutine 中
* 模块间通过一套轻量的 RPC 机制通讯(
Leaf 不建议在游戏服务器中设计过多的模块。
游戏服务器在启动时进行模块的注册,例如:
leaf.Run(
game.Module,
gate.Module,serif; font-size:12px; line-height:1.8em"> login.Module,serif; font-size:12px; line-height:1.8em"> )
复制代码
这里按顺序注册了 game、gate、login 三个模块。每个模块都需要实现接口:
type Module interface { OnInit() OnDestroy() Run(closeSig chan bool)
}
复制代码
Leaf 首先会在同一个 goroutine 中按模块注册顺序执行模块的 OnInit 方法,等到所有模块 OnInit 方法执行完成后则为每一个模块启动一个 goroutine 并执行模块的 Run 方法。最后,游戏服务器关闭时(Ctrl + C 关闭游戏服务器)将按模块注册相反顺序在同一个 goroutine 中执行模块的 OnDestroy 方法。
Leaf 源码概览
* leaf/chanrpc 提供了一套基于 channel 的 RPC 机制,用于游戏服务器模块间通讯
* leaf/db 数据库相关,目前支持
* leaf/gate 网关模块,负责游戏客户端的接入
* leaf/go 用于创建能够被 Leaf 管理的 goroutine
* leaf/log 日志相关
* leaf/network 网络相关,使用 TCP 协议,可自定义消息格式,目前 Leaf 提供了基于
* leaf/recordfile 用于管理游戏数据
* leaf/timer 定时器相关
* leaf/util 辅助库
使用 Leaf 开发游戏服务器
LeafServer是一个基于 Leaf 开发的游戏服务器,我们以 LeafServer 作为起点。
获取 LeafServer:
git clone https://github.com/name5566/leafserver
设置 leafserver 目录到 GOPATH 后获取相关依赖:
go get github.com/name5566/leaf
go get github.com/golang/protobuf/proto
go get gopkg.in/mgo.v2
编译 LeafServer:
go install server
如果一切顺利,运行 server 你可以获得以下输出:
2015/08/26 22:11:27 [release] Leaf starting up
敲击 Ctrl + C 关闭游戏服务器,服务器正常关闭输出:
2015/08/26 22:12:30 [release] Leaf closing down (signal: interrupt)
复制代码
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
相关文章
猜你在找的Go相关文章
代码https://github.com/fangkang7/goLearn.git案例package mainimport "fmt"func main() {type Person struct {name stringage intsex boollike []string}p := Person{}p.name = "咔咔"p...
代码https://github.com/fangkang7/goLearn.git案例在上一节中我们可以直接在函数内部创建结构体如图在这一节我们将在使用三种方式来创建结构体对象package mainimport "fmt"type Person struct {name stringage intaiaho []string}func main(...
代码地址https://github.com/fangkang7/goLearn.git案例案例解释不管是返回切片还是返回映射,函数的参数类型都是一个切片切片需要用时append来进行扩容映射则直接键值的方式即可源码package mainimport "fmt"func main() {retMap := isWudebeishu(5, 16, 25, 30, ...
代码匿名函数的应用场景一次性的调用有必要的代码封装应用案例:defer 和 godefer的应用场景defer是一个延迟执行的指令。这个在之前的defer延迟执行学习过了,不能忘记哦!defer会在所有程序运行结束后执行,假如有多个defer谁在最后谁先执行这个应用场景就是延迟执行一个匿名函数 ,这个函数需要进行简单的封装,但是又不进行复用,所有就直接使用匿名函数即可go的应用...
咔咔博客之标准库strings,这个不会说的过多,以后项目上用到得话在回头来查。就算现在记着了,过几天也会忘记了,所以在这里就不浪费时间了案例在这个案例中,我用PHP的经验在这里挑选了几个常用的接口。每个库的数据都是相当的大的,全部学习一遍没那个必要。了解一点常用的,在项目有需要时反过来在找就行在这个库里最常用的就是判断一个字符串是否在另一个字符串中还有一个就是把字符串根据某一规则...
咔咔博客之面向对象首先我们需要明确一个概念那就是什么是面向对象面向对象简称OOP,是一种计算机编程架构,使用面向对象编程可以实现代码的重用性,灵活性,扩展性。面向对象符合人类看待事物的一般规律。使其代码更简洁,更容易维护,并且具有更强的重用性在PHP中面向对象的三大特性:封装、继承、多态当然在go中也是一样的在PHP中我们有类 但是在go使用的是结构体基础案例在之前我们所有的案例...
咔咔博客之继承性继承的意义在于低成本地扩展和改造原有代码首先,子类一行代码即可拥有父类的全部成员(属性和方法)继承的目的,在于扩展和改造父类扩展,是指子类发展出自己独有的新属性和新方法,以适应自身需求改造,是指子类覆写和覆盖父类成员(属性和方法),以适应自身需求代码地址https://github.com/fangkang7/goLearn案例首先我们需要定义父级的结构体和方...