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版)》是一本专门介绍如何开发多人网络游戏的实战书籍,手把手教你搭建网络框架,制作大型项目。
系列文章