当前位置: 首页 > 软件库 > 程序开发 > 游戏开发包 >

Leaf-go

游戏服务器框架
授权协议 Apache
开发语言 Google Go
所属分类 程序开发、 游戏开发包
软件类型 开源软件
地区 国产
投 递 者 东博瀚
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性:

  • 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率

  • 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃

  • 多核支持。Leaf 通过模块机制和 leaf/go 尽可能的利用多核资源,同时又尽量避免各种副作用

  • 良好的模块支持。

一个 Leaf 开发的游戏服务器由多个模块组成(例如 LeafServer),模块有以下特点:

  • 每个模块运行在一个单独的 goroutine 中

  • 模块间通过一套轻量的 RPC 机制通讯(leaf/chanrpc

Leaf 不建议在游戏服务器中设计过多的模块。

游戏服务器在启动时进行模块的注册,例如:

leaf.Run(
    game.Module,
    gate.Module,
    login.Module,
)

这里按顺序注册了 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 数据库相关,目前支持 MongoDB

  • leaf/gate 网关模块,负责游戏客户端的接入

  • leaf/go 用于创建能够被 Leaf 管理的 goroutine

  • leaf/log 日志相关

  • leaf/network 网络相关,使用 TCP 协议,可自定义消息格式,目前 Leaf 提供了基于 protobuf 和 JSON 的消息格式

  • 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)
  • 转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。 Leaf 的关注点: 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性

  • Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性: 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 多核支持。Leaf 通过模块机制和 leaf/go 尽可能的利用多核资源,同时又尽量避免各种副作用 良好的模块

  • Leaf ChanRPC 由于 Leaf 中,每个模块跑在独立的 goroutine 上,为了模块间方便的相互调用就有了基于 channel 的 RPC 机制。一个 ChanRPC 需要在游戏服务器初始化的时候进行注册(注册过程不是 goroutine 安全的),例如 LeafServer 中 game 模块注册了 NewAgent 和 CloseAgent 两个 ChanRPC: package

  • Leaf Go 善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题: 能够恢复 goroutine 运行过程中的错误 游戏服务器会等待所有 goroutine 执行结束后才关闭 非常方便的获取 goroutine 执行的结果数据 在一些特殊场合保证 goroutine 按创建顺序执行我们来看一个例子(可以在 LeafServe

  • 思路 先递归找到所有的叶子节点,再循环判断 code type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func leaf(root *TreeNode, ret *[]int) { if root == nil { return } if root.Left == nil && root.Rig

  • 现在,在 LeafServer 的基础上,我们来看看游戏服务器如何接收和处理网络消息。 首先定义一个 JSON 格式的消息(protobuf 类似)。打开 LeafServer msg/msg.go 文件可以看到如下代码: package msg import ( "github.com/name5566/leaf/network" ) var Processor network.Proces

  • 1、首先看一下在数据库中建立的表结构: CREATE TABLE `leaf_alloc` ( `biz_tag` varchar(128) NOT NULL DEFAULT '',//主键,这个应该是用来区分不同的业务线的 `max_id` bigint(20) NOT NULL DEFAULT '1',//最大ID `step` int(11) NOT NULL,//步长 `

  • Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率 并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性: * 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 * 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 * 多核支持。Leaf 通过模块机制和 * 良好的模块支持。 一个 Leaf 开发的游戏服务器由多个

  • 生命不止,继续go go go!!! HTTP与HTTPS 在WWDC 2016上,苹果在发布iOS 9的同时也向开发者传递了一个消息,那就是到2017年1月1日时App Store中所有应用都必须启用 App Transport Security应用程序安全传输协议,从而提升应用和系统安全性。 HTTPS是Hyper Text Transfer Protocol Secure的缩写,相比http

  • 零:源码和IDE golang源码: https://github.com/golang/go goplus源码: https://goplus.org/ https://github.com/goplus/gop IDE: https://www.jetbrains.com/go/  -- goland,推荐 https://zhile.io/ -- 不用多说,你懂的!! https://git

  • Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 Unity3D, UE4/UE5, Cocos2dx, Web (HTML5)游戏服务器。通过本章的内容学习,让同学们尽快掌握与使用。   适合人群: Go 服务器开发(从零开始学习 基础篇)  有一定go 语言基础人群 游戏服务器开发 对服务器有兴趣的人群

 相关资料
  • 我试图建立一个通用服务器总是在连接的客户端。 该体系结构由4个主要组件组成 有状态应用服务器 无状态网关服务器 客户排队 系统和经纪人 工艺流程 客户端连接到网关 我正在使用JavaNetty作为网关。appserver也是用Java编写的。 我很想说这个设计像Mongrel2,但我不能完全确定。我想说,这更符合城市飞艇氦边缘服务器的设计(http://urbanairship.com/blog/

  • JAGS 游戏服务器是一个开源的 Java / AS 3.0 的游戏服务器,支持多玩家、碰撞检测以及键盘事件等等。

  • 二本鼠鼠学Java没出路。。 技术面 - 50min - 9.26 自我介绍 介绍一下你的项目经历 MySQL索引底层结构 Redis有哪些数据结构 Redis的持久化机制 学过其他语言吗(c++和go),说一下c++、go、Java的区别 LRU怎么实现 最短路径算法实现 JVM垃圾回收算法 手撕在一排数据中算出不重复数据的子集 TCP三次握手 你知道什么是SYN攻击吗 TCP四次挥手为什么是四

  • 过年回上海裸辞出去玩了一个月,5月回来找的工作,正好现在有时间了,抽空写一下社招面经,有些已经忘记了。裸辞还是太冲动了,菜鸡不配gap,两年工作经验不应该随便裸辞,还是太年轻、太狂妄了。当年校招腾讯、祖龙、小米等等offer随便拿,以为社招还跟校招一样简简单单,结果现在只能去个小公司养老了。 巨人网络(球球大作战) golang游戏后端,线下1、2、3面一起的 一面 项目架构图 pb的底层实现结构

  • 我正在尝试构建一个使用套接字和udp协议的python在线游戏。我创建了一个多处理和多线程服务器:https://pastebin.com/zucxwpc9。 我会解释里面的代码是做什么的。所以首先,它等待两个请求,并将它们放入lobby列表中。如果发出了两个请求,服务器将向客户端发送一个新端口,并创建一个具有两个线程的新进程。两个线程都在使用新端口,一个接收数据,另一个发送数据。我正在使用队列,

  • 最后,是否可以重复使用相同的runnable(每个游戏会话1个),而不是每回合创建一个新的。