GoWorld是一套分布式开源Go语言游戏服务器引擎。它采用Entity/Space(实体/空间)的逻辑抽象结构,这种近年热门的逻辑抽象,适用MMORPG、RTS、射击等类型游戏。在逻辑层用Entity(实体)代表场景中的玩家、怪物、NPC之类的对象,用Space(空间)代表游戏中的场景,Entity可以在不同场景间跳转。此种抽象使得游戏的网络通信模式较为统一,能够在框架层做更多的功能,顶层逻辑无需关心数据同步,能提高游戏开发效率。GoWorld使用分发器作为中间转发层,使整个服务端结构变得很简单,容易扩展。

GoWorld的作者Seis从2017年发布第一个版本以来,在Github上已获得上千个Star。笔者近期在探寻Go语言开发游戏服务端的可行性,学习和借鉴GoWorld的思路,也借此写个教程。这篇教程会用一个个小实例解释GoWorld的使用方法,后期会解析源码。

github地址: https:// github.com/xiaonanln/go world

GoWorld结构图

下图是goworld的结构图,可见它会开启3类进程。其中dispatcher和gate都是固定的程序,只有game需要我们自己编写。

客户端连接到gate,它负责网络消息的接收和转发;dispatcher负责消息分发;game是游戏逻辑所在,也是Entity/Space活动的地方。

安装

学习一套引擎的前两个步骤,必然是先安装它、然后运行它。

Go的一些程序库需要连接网络下载,然而它是google出品的语言,国内网络无法流畅的访问,安装go的应用需要使用些技巧。此处会把在centos下的安装过程详细写出,其他系的系统的安装过程也类似。

安装GoWorld项目后,可以通过命令行goworld xxxx来操作,比如使用goworld start examples/chatroom_demo开启聊天服务器。

1、安装go语言

yum install go

2、设置go的路径,添加执行路径

vim ~/.bashrc

添加两行(假设go语言安装在默认的 /root/go)

export GOPATH=/root/go

export PATH=$PATH:/root/go/bin/

3、安装goworld所需的依赖包

位于http://github.com、http://uber.org等上面的依赖包使用go get -d安装即可,非常方便。

go get -d http://github.com/go-ini/ini

go get -d http://github.com/chasex/redis-go-cluster

go get -d http://github.com/garyburd/redigo/redis

go get -d http://github.com/go-sql-driver/mysql

go get -d http://github.com/golang/snappy

go get -d http://github.com/pierrec/lz4

go get -d http://github.com/pkg/errors

go get -d http://github.com/sevlyar/go-daemon

go get -d http://github.com/vmihailenco/msgpack

go get -d http://github.com/xiaonanln/go-aoi

go get -d http://github.com/xiaonanln/typeconv

go get -d http://go.uber.org/zap

go get -d http://go.uber.org/zap/zapcore

go get -d http://gopkg.in/mgo.v2

go get http://gopkg.in/mgo.v2/bson

4、手动安装依赖包sys/unix

部分依赖包位于http://golang.org,国内网络无法访问,也就无法使用go get安装。由于大部分的包都能在github上找到源码,可以下载代码,然后手动安装,具体命令:

cd /root/go/src/http://golang.org/x

git clone https://github.com/golang/sys.git

cd sys/unix

go install

5、安装goworld

go get -d http://github.com/xiaonanln/goworld

cd /root/go/src/http://github.com/xiaonanln/goworld

go install

如果安装goworld的过程中提示超时或缺失依赖包,只需按照上面的方法先安装依赖包,缺什么就安装什么。只要安装了所有的依赖包,才能顺利安装GoWorld。

6、测试

安装成功后,执行goworld指令,应能看到如下图的提示,说明安装成功。

运行聊天室示例

GoWorld提供了两个示例,聊天室是最简单的,我们将尝试运行它。聊天室示例位于goworld目录下的example/chatroom_demo,它只含有4个go文件(如下图),后续可以仿照示例编写自己的游戏逻辑。

1、安装依赖包

由于聊天室示例用到一些包,需要安装它们。

#使用go get自动安装下面的包

go get -d http://github.com/petar/GoLLRB/llrb

go get -d github.com/xtaci/kcp-go

#手动安装crypto/blowfish包

cd /root/go/src/http://golang.org/x

git clone https://github.com/golang/crypto.git

cd crypto/blowfish

go install

当然,也可以在后续的编译过程中看看错误提示,缺少什么安装什么。

2、编译

进入目录goworld的目录(cd /root/go/src/http://github.com/xiaonanln/goworld),执行如下的build指令编译。

goworld build examples/chatroom_demo

执行成功后应可以看到example/chatroom_demo目录下多出一个名为chatroom_demo的二进制文件,它是编译后产生的可执行文件。

3、运行

执行start 命令,运行示例。

goworld start examples/chatroom_demo

服务器开启后应能看到如下图的提示,指示开启了dispatcher、game和gate。

如果执行status指令,可以查看服务器运行的状态,可看到目前开了3个进程。

goworld status examples/chatroom_demo

如果执行stop指令,可以关闭服务器。

goworld stop examples/chatroom_demo

至此游戏服务端已经成功运行,由于聊天程序的客户端使用cocos编写,本篇不打算介绍cocos相关内容,读者可以自己安装cocos并测试。下篇将介绍第二个示例的运行方法,包括客户端和服务端的搭建,第二个示例稍微复杂,它是个射击游戏,采用Unity作为客户端。

推荐些资料

「同步」也是网络游戏开发的核心课题。玩家的位置和旋转需要同步给其他玩家,然而网络条件差,会不同步和卡顿。笔者主讲的live《网络游戏同步算法》揭示做好同步的方法,欢迎收听。

网络游戏同步算法​www.zhihu.com

笔者所著《Unity3D网络游戏实战(第2版)》是一本专门介绍如何开发多人网络游戏的实战书籍,手把手教你搭建网络框架,制作大型项目。

系列文章

罗培羽:游戏服务端开源引擎GoWorld教程—— (1)安装和运行

罗培羽:游戏服务端开源引擎GoWorld教程——(2)Unity示例双端联调

罗培羽:游戏服务端开源引擎GoWorld教程——(3)手把手写一个聊天室

罗培羽:游戏服务端开源引擎GoWorld教程——(4)制作多频道聊天室

罗培羽:游戏服务端开源引擎GoWorld教程——(5)登录注册和存储

罗培羽:游戏服务端开源引擎GoWorld教程——(6)移动同步和AOI

罗培羽:游戏服务端开源引擎GoWorld教程——(7)源码解析之启动流程和热更新

罗培羽:游戏服务端开源引擎GoWorld教程——(8)源码解析之gate

罗培羽:游戏服务端开源引擎GoWorld教程——(9)源码解析之dispatcher

罗培羽:游戏服务端开源引擎GoWorld教程——(10)源码解析之entity