网游服务器技术-语言选择

仔细算算,参加网游开发已经3年多了。虽然参与最多的,都是逻辑玩法部分的开发,但是对于服务器的架构,逐渐有了点认识。
13年年底,利用工作之余自己编写了个简易的服务器框架。而最近又看了看nodejs,打算重新整理下思路,对服务器框架进行重构。
于是就有了这几篇关于服务器的文章,希望是最自己知识的总结,也是希望有所沉淀。

编写一套网游服务器引擎,首先就需要选择好语言。而我选择的是纯python。
编程语言多达上百种,适合服务器开发的有:python,lua,c,c++,c#,javascript,erlang,go。语言真是层出不穷。
而服务器开发,需要的语言应该具备的特性有:
1、不错的执行性能
2、方便快捷并且高效的开发速度
3、代码热更新
4、可调试性

以上面列举的几种语言为例(erlang不在本次讨论范围,因为我没看过,也不懂):
1、执行效率:
这个C无疑是最佳的。C++,go也不错。据说go是下一代C/C++。目前从网络资料上来看,go的性能也不差。
js因为google V8的存在,现在nodejs流行的一塌糊涂。C#虽然性能不及C,但是安全性强太多。
lua效率不错,但是需要一个主语言来支撑。python是这里面效率最差的。地球人都知道。
所以,很多公司采用的是:  C/C++与lua的组合。或者nodejs。
我经历过的两家游戏公司中,一个是C++与lua组合,一个是C++与python组合。我在这两家公司都做过服务器的性能优化。
最后得出一个结论:影响执行效率的往往不是语言,而是逻辑玩法与架构。目前来说,很多人一提到python就说这语言垃圾,效率太差等
我可以很负责任的告诉你,如果你的游戏最高在线低于1百万,你完全可以放心的使用python。当然了,前提是你要会用python,
而不是完全不计后果的胡乱编写。就算是用C,如果在编写规范上不合格,你的服务器效率说不定还不如python。
除非是你的游戏规模达到了百万级,否则,千万不要以为服务器慢就算语言的问题。
你的编写是否规范,架构是否合理,都可能成为性能瓶颈
2、开发效率:
经历了3年多的游戏开发,我是厌倦了C++了。编译速度实在不敢恭维。即使我们后来采用了联编工具,速度缩短到原来的1/4左右,但是还是不堪忍受。
有时候吃饭回来,尼玛还在编译。这一点上,python、lua、js等脚本语言的优势就体现出来了。
用记事本打开就可以写代码,也不需要长时间的编译,写完就可以进游戏验证。这也是我最终选择python的一个重要原因。
3、热更新:
如果你的服务器没有脚本层,那么一旦发现错误,哪怕只需要修改一个字母,你都不得不重新编译程序,然后重启服务器。
而脚本带给我们的,将不仅仅是开发效率上的提高,更方便的是热更新的功能。
玩法逻辑一般写在脚本中,一旦发生错误,可以立即修改代码并重新加载一次。服务器不需要重启。
如果是在游戏运营期间发生了重大bug,立即就可以在线更新解决。这一点上来看,python、js都很不错。
4、可调试性
这一点上,C/C++简直完爆其他语言。不因为别的,就因为有个IDE叫VisualStudio。不得不说,vs是我目前使用过的ide中最让我怀念的。
看代码的时候,可以alt+g,可以在游戏执行过程中断点跟踪代码。在这么强大的调试器面前,一切bug无所遁形。
而python、lua,我们更常用的是不停打log,或者打印调用栈信息。相比之下,高低立现。而我选择了使用纯python开发,
而不再是C/C++主导,于是python也可以直接调试了,加上PyCharm这个很不错的IDE,打印log不再是唯一的调试手段了。

通过以上比较,可以发现,C++与lua的组合,无疑会更方便快捷。python和js的开发效率无疑是最佳的。
这也是很多公司采用C++和lua组合的原因。毕竟很多公司都是有自己的技术积累的,服务器引擎基本都是公司里面的技术高层编写的。

但是仅仅依靠这些,还无法利用语言的优势快速构建一套服务器引擎架构。
时至今日,开源项目越来越多,各种语言的周边工具也是越来越丰富。如果能利用好这些第三方库,都将能极大的提高开发效率。
记得以前在学校学习mfc的时候,网上各种mfc的美化库,但是都是收费和闭源的。那时候,我得出一个结论:
C++的东西,虽然做的都很好,但是尼玛都要钱,要么是商业化的,要么开源的都是写的很烂的。

据我所知,目前开源的网游服务器框架有:9miao社区的firefly,网易的pomelo。
firefly是python开发的,基于python中一个庞大的twisted网络库完成。用过python的人都知道,python强大的第三方库,能给你的开发提供各种便利。
甚至可以说,你不需要自己编写哪怕是一行的底层代码,只需要利用好这些第三方库,就能整合出一个服务器框架。
重复造轮子的事情我也干过不少,但是有什么用呢?开发的目的是产出成品,而不是原地踏步的造轮子。最重要的是,你确定你自己写的比其他人写的好?
能开源出来,并且被大家所赞同的库,我从不认为会比我自己写的差。
pomelo是基于nodejs的服务器框架,采用js编写。而我并没有采用nodejs,最大的原因是,nodejs更适合前端程序员。这将是一个完全异步的编码。
到处都是回调函数。而不像我们的思维是线性的。甚至有人说,nodejs的开发是反人类的,这当然是有点偏激了。但是也正说明了nodejs开发中的不爽之处。

所以,基于以上各种原因,我最终选择了python。
网络库:我采用twisted或者gevent。数据库具体是mysql还是mangodb,都可以,反正python都有对应的库。
日志、定时器、事件系统等等,我只需要简单的编写和抽象,或者对python中提供的功能进行整理,一个服务器框架就成型了。
于是,我不再需要投入过多的经历去研究这些底层的技术,我可以放心的去编写游戏的具体逻辑,早日做出一个demo。

总结下:选择什么样的编程语言,需根据公司或者你个人的情况而定。
没有最高效的语言,只有最高效的框架和编码规范。



你可能感兴趣的:(性能,python,编程语言,服务器,网游)