开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
GoWorld首页、文档和下载 - 分布式游戏服务器引擎 - 开源中国社区
全部项目分类
Apache
Google Go
跨平台
seis
分享
收藏
94 人收藏
收录时间:2017-07-29
GoWorld 详细介绍

GoWorld是一个使用Golang实现的可扩展的分布式游戏服务器引擎,并支持游戏逻辑的热更新。

进程结构

GoWorld架构图

一个GoWorld系统包括一个dispatcher进程、一个或者多个game进程以及一个或者多个gate进程。dispatcher负责game之间以及gate和game之间的消息转发,并对一些基础功能提供支持。Game进程负责Entity对象的管理和所有游戏逻辑的运行,Gate进程负责管理客户端连接,并将客户端请求通过dispatcher转发到game进程。Gate还需要负责对客户端数据进行压缩和加解密(尚未实现)。GoWorld可以通过增加更多的game进程或者gate进程来增加服务器的负载能力。虽然dispatcher进程是GoWorld服务器中的单点,但是初步的测试和推算表明一个多核高性能的主机上运行dispatcher可以支持100万以上的同时在线。

热更新

GoWorld使用Hot-Swappaing的方式实现游戏逻辑的热更新。在Game进程收到SIGUSR1信号的时候,就会把当前所有Entity以及其他相关状态保存到一个文件中,并结束进程。此时可以使用最新的可执行镜像重启game进程,并从保存的文件中恢复所有的Entity和游戏状态,并恢复执行。在热更新的过程中,玩家客户端的连接不会中断,玩家角色的状态也会保持不变,只是会感受到一点卡顿,并在热更新结束后恢复。

Entity架构

Entity RPC

在GoWorld中,我们使用一个Entity来代表游戏场景中的玩家、怪物、NPC之类的对象。GoWorld还支持从客户端到服务端的RPC通信,以及服务端Entity之间的RPC通信。

GoWorld在RPC数据的封包和解析上使用了MessagePack格式,并会在将来支持Google Protobuf。

场景

场景(Space)是GoWorld中一个非常重要的概念。每个Entity都属于一个场景。同一个场景的Entity之间可以直接调用相互的函数,而跨场景的Entity之间需要使用RPC来进行通信。Entity可以通过迁移(Migrate)函数来跳转到别的场景中,跳转场景后Entity的所有属性数据都将保持不变。

AOI

GoWorld提供了一套简化的AOI机制。同场景的Entity之间会根据距离维护一个邻居列表。GoWorld使用十字列表维护场景里的所有Entity,从而根据Entity的位置变化实时更新所有Entity的AOI信息。

属性同步

GoWorld为Entity提供了属性机制。属性分为服务端属性、客户端属性和全局属性。服务端属性只有在服务端可以访问,客户端属性可以在客户端和服务端同时访问。每次服务端对其进行修改的时候,属性的变化会立刻被同步到客户端,从而保持客户端数据的实时更新。全局属性是对所有Entity都可见的数据,包括其他玩家。全局属性在发生变化的时候会被广播到AOI范围内的所有玩家,从而使得玩家可以实时获取AOI范围内其他Entity的属性变化。

Entity存盘和载入

GoWorld支持Entity的自动存盘。持久化(persistent)的Entity会按一定的时间间隔进行存盘。GoWorld还提供了对已存盘Entity的载入功能。目前GoWorld支持MongoDB和Redis两种不同的底层数据库。

客户端连接和通信

每个server都会创建一个监听端口用于接收来自客户端的连接。客户端和服务端之间也采用一个RPC的通信方式。客户端可以对玩家和玩家AOI里的其他Entity发起RPC调用。

GoWorld支持对客户端通信进行压缩。加密功能还有待添加。。。

还在开发阶段,更多内容有待补充,敬请关注

GoWorld

选择将代码托管在码云
你还在等什么

可能是中国最大最好的代码托管平台


大家对 GoWorld 的评论 (全部 5 条评论)
{{repayCom.userName}}
BaiYang
感觉 dispatcher 可能成为可用性和性能上的瓶颈。使用分布式协调(选举、发现、锁等)代替绝大部分消息转发,并将其想架构的更后端移动可能有效缓解此类问题。或者使用可横向扩展的消息队列产品。
FPE
dispatcher和game换一下还差不多,不然这跟单服务器没啥区别,但是换过来的话难度就增加不少了
哦吧啊
这样的服务器做不了低延迟的动作联网游戏
花儿不红
测试一下,需要几台服务器?
seis
你说的有道理,以后可能会考虑扩展成多个dispatcher
目前由于dispatcher本身的逻辑非常简单,而且Golang能够很好的利用多核的计算能力,因此单个dispatcher可以支持百万的同时在线,估计暂时不会成为瓶颈
顶部