用Scala编写MMORPG的游戏服务器

一般说到游戏,那么大多数技术人员想到和使用的都是C和C++。需要之前从业于客户端或者家用主机游戏开发的人员,也是以这两种语言作为核心工具,当然,最近几年Lua作为脚本使用的很多。

基于JVM去构建游戏服务器,是一个带有一定风险的尝试。但一方面由于Scala所提供的基于Actor的并发模型,从概念上非常适合于做一个MMORPG世界的模拟,可以给开发带来很好的逻辑描述和设计。另一方面,网页游戏的市场,对服务器的负荷要求还没有到达大型客户端网游的水准。

还有个潜在的原因,C++经过了这么多年的发展,确实几乎可以用于所有类型的应用需求,但众多的标准,模板和库,真正有经验和能力可以把握住的并不好找。而对于Scala而言,只要过去使用过Java在JVM上进行开发的人,转移起来都比较容易,尽管Scala有许多语法的特性和Actor相关的模型,要想使用好,仍然要有思路上的拓展,但即便用的没那么熟练,也不是会造成太多混乱的问题。

Actor模型本身就很像一个MMORPG世界的模拟,玩家都是独立的Actor,世界上发生的事情会通过Event类型的消息被玩家接收到,玩家之间的交互影响,都可以抽象为消息的发送和接收。同时真实玩家在客户端的操作,以一个Request的消息形式发送给对应的Actor,Actor上执行control的方法来处理各种Request,被响应的Request最终变成Event和Response通知到世界其它Actor和客户端。

这就是我们世界服务器所采用的一个基本逻辑设计概念。与传统一些通过心跳控制服务器处理帧率的方式不同,Actor的模型下,是尽可能允许消息的并发。多线程并发的问题完全交给Actor模型去做,我们只需专注于游戏世界的开发即可。用下来整体感觉比较轻松简单。

如果之前使用过Erlang的人,对Actor模型应该理解的更快。没使用过的,容易犯一些初级的错误,使得并发时出现问题,或者把Actor阻塞到挂起。 在之后的项目中,推荐使用Akka中的Actor。其提供的模型和接口更完整,性能也更好一些。

不过Scala也有一些弊端。在JVM上构建应用,许多人都喜欢使用eclipse作为开发IDE,但这个IDE工具,本身对性能以及内存消耗不少,还经常容易出一些莫名其妙的问题,尤其是在安装了Scala项目的插件之后,造成短时间内感觉很卡的样子。我现在尽量地不使用类似eclipse这样的工具,主要编辑都是在Sublime Text 2里完成。

第二个弊端是Scala中提供的泛型集合种类太多,许多种类在表面接口上看上去差不多,但实际的调用在不同场景下有不同的适应者。要使用Scala,推荐先从弄清楚接口中提供的泛型的使用场景和方法间的性能差异。避免遗漏错误。

第三点在于,从维护和性能调优的角度来说,需要对JVM的调优和维护方式有所了解。这点上之前由于缺乏相关经验,犯过一些错误。

总体上看,用Scala做一个不是特别大型的MMORPG游戏的世界模拟服务器是个可行的选择。主要是包括了世界模拟和一些规则实现,网络部分,我们还是采用了更成熟的Erlang实现,再通过JInterface和世界模拟器结点通讯。

国内使用Scala的个人和团队似乎还比较少,寻找一个Scala的程序员可能也不比寻找一个靠谱的C++程序员要容易。国内使用Scala的朋友和团队,也欢迎加入我们或和我们交流。