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

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

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安装即可,非常方便。

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

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

git clone

cd sys/unix

go install

5、安装goworld

go install

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

6、测试

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

运行聊天室示例

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

1、安装依赖包

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

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

#手动安装crypto/blowfish包

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《网络游戏同步算法》揭示做好同步的方法,欢迎收听。


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

系列文章