它和云风过往放出来的东西一样,是非常具有实践性的,可以解决实际开发问题的。目前我所在的手游项目使用 Erlang 进行服务器端开发的,如果重新开始,我会选择使用 skynet。
游戏服务器开发中的难点,上面 @无瞳已经提到了两个,我再加一个:隔离性。比如说,在C/C++写的服务器中,一行代码中的空指针访问,就会导致整个服务器进程crash,这就是很差的隔离性,在服务一个玩家的过程中发生的错误,会影响到对其他玩家提供服务的能力。
传统的端游服务器开发中,性能是硬性指标,语言上几乎没有选择,必须使用C/C++。但是页游和手游对单机性能的要求降到了非常低的水平。这个时候,Erlang在解决异步通信以及强隔离性上的优势就体现了出来。
但是 Erlang 也有它的问题。
首先,就是很难招人。
一方面,国内小公司很难招到靠谱的程序员。Erlang 本来就比较小众,所以大多数情况下只能是招进来不会 Erlang 的,让他自学+一些指导。
在我从某大厂出来以后面试的十几个人中,能好好用C语言写完一个 atoi 函数的,只有一两个。倒不是 Erlang 有多难学,只是功底差成这样的人,他会不会有意愿去学就是个很大的问题,你敢不敢相信他能学好都是其次了。
其次,Erlang 的一些特性确实降低开发效率。
这是一句非常招黑的话,我也没有时间写太详细,只是一些个人感受。
首先就是 Immutable。这个特性对游戏发开来说非常头疼。目前的手游服务器里数值计算占的比重不多,更多的是对状态的修改。玩家要升个级,你要Level+1,玩家做做这,做做那,最终体现到代码上的,都是对状态的修改。而 Erlang 的 Immutable,配合很费键盘的Record语法,让写这些代码的过程非常繁琐。
另外就是 Erlang 不支持在函数中间直接return,在写很多游戏逻辑的时候,是非常蛋疼的。
因为上面这些原因,我觉得最适合目前手游的服务器开发语言是这样的:
(1). 和 Erlang 一样的进程模型,强隔离性。
(2). 类似 C 的命令式语言。
但是要写出这样的一门语言,需要非常大的工作量(可以参考 Erlang 虚拟机的代码量。)
skynet 在我看来是做了一个trade off。它不支持如 Erlang 般便宜的进程(因此在隔离性上有所降低,但依然比C/C++强。),但是开发 skynet 本身所需的工作量大大降低。