有关网游编程的一些问答

来源:互联网 发布:投标书制作软件 编辑:程序博客网 时间:2024/04/19 03:18

作者: 赖勇浩

引子


今天一个朋友,主持
开发过一个目前有几百万用户的 SNS,向我问一些关于网游编程的问题。后来我觉得这个对话其实挺有代表性的,就我个人而言,类似的对话我已经做过不下十次了,所以这次我决定把它整理出来,如果有对 webgame 或 game 编程感兴趣的朋友,可以参考一下。以下回复仅代表个人对网游编程技术的了解,可能有错误或偏颇,不可当作“权威性质的参考资料”。

正文


问:我最近对做webgame比较有兴趣,有没有什么可以参考的资料,我想学习下,以对有个了解。

答:额……我手上没有。我做 webgame 是因为我之前做的是泡泡游戏(http://popogame.163.com),泡泡游戏类似于 qqgame,我觉得可以把它搬到 web 上,所以就动了手,如果没有这个经历,我可能也不知道怎么去弄。
问:我现在就是不清楚游戏怎么做的,从业以来,没接触过。感觉和做网站不一样,交互性貌似不同。
答:经验不重要,只要你想做就可以做了,比如你就想着你要做一个“拳头剪子布”,然后分析应该怎么做,然后做一个出来……就可以了。
问:“拳头剪子布”和echo socket好像一样的吧:
答:不一样吧,echo server 只响应一个连接,而拳头剪子布是两个连接之间的行为,而且你还为为它们行为做个仲裁。还包括怎么把这两个连接配对在一起,无法配对的时候怎么办,其中一个强制脱离配对怎么办……这些问题越问越多,你就越清晰。但最好不要有问太多“为什么”的习惯,尽快动手去尝试,会更好。因为做一个拳头剪子布对你来说,失败的成本实在太低,完全可以什么都不想,然后去做……做出原型,然后不停地抛弃原型,然后你就上道了……
问:现在业内评价一款webgame的技术点有哪些?
答:这个不清楚。
问:换句话说,那些地方容易出问题?
答:webgame 这个领域的技术日新月异,发展无比迅猛,而且 Web 领域的和 Game 领域的人都同时进入这个新兴区域,产生了技术碰撞,也引起了许多新的用法。我了解得也不多。
问:下游戏业内当前主流的服务器框架和技术有哪些?
答:Game 不像 Web,极少所谓的框架和通用技术。那些所谓的引擎、组件,也只致力于解决一部分问题。它们很乐意于被用户当成“项目的一部分而存在”,而不像 Web Framework 那样想一招鲜,想一个东西搞定所有需求。
问:连通用的模型都没有?
答:是的,游戏的种类太多,所以很少通用的模型。比如开心农场和开心水族箱用到的技术,大有不同。
问:那些引擎、组件都有啥?
答:我觉得你没有必要去了解引擎、组件之类。你现在想进入这个领域的话,最好的方法是“赤手空拳”,直接打入。
问:额……我没有一点基础……
答:充分地应用你在 Web 的经验,我觉得就够了。不要想着去补短板,多想怎么怎么发挥自己的长板。
问:不会 c++ 不会java 不会并发编程……
答:晕……这些东西未必用得上……最赚钱的 webgame 之一,热血三国,服务器端是纯 php。起码早期是这样的,后期我不太清楚了,估计不会有什么大的变动。
问:其实我说的网游不一定就是 webgame,也包括客户端那种的,对我而言很神秘。想了解下做服务器端编程。
答:你可以把网游服务器端编程想像成你自己要做一个 web server,当然,会更特定一些,对可扩展性的要求低一些,但是有些方面需要比 web svr 更强。
问:意思是只要有做 web 服务器的功力就可以通吃了?
答:不是可以通吃,web server 的业务模型跟 game server 的业务模型相差甚远。比如 web svr 看重并发性,而 game svr 更看重的是“顺序”,如果 game client A 发生事件序列的顺序是 1 2 3,game svr 必须保证经过它的同步,client B 一定会发生同样的事件序列,并且顺序也一样。甚至 game svr 本身就跑着一个业务逻辑,它本身也要发生事件序列 1 2 3。
问:这样一来并发性似乎不容易很高吧?业内单机的连接数一般是多少?
答:嗯。看情况啊,game svr 通常按组来算“容量”,一组服务器可能有 1、2 或更多物理机器。
问:这是个什么概念?
答:game svr 通常是一个“集群”系统。
问:没有单机连接数的说法?
答:有,因为很多时候一个物理器可以跑一个集群系统甚至多个集群系统,回合制游戏,一台现在的常见的机器,可以服务几千甚至上万个玩家。设计得结构良好的棋牌系统,一台物理机器也可以服务上万个玩家。当然,也有一些大型游戏,需要若干台物理机器才能够完成一个 game svr 的需求。
问:这么厉害?
答:因为业务量其实很小的。不像 Web,一个请求过来需要读数十次硬盘,game 的业务请求往往全部在内存里解决。
问:意思是全内存运算?数据库连接呢?
答:是的。我们通常会把若干 G 的数据 load 到内存,很多业务根本不需要读到 DB 的,因为玩家的状态全部在内存里。
问:上 G 的数据全部在内存中,万一当机或者数据不一致怎么办?
答:游戏会回档,就是因为发生了你说的这种“杯具的事情”
问:玩家数据就简单的放在内存里?没有任何分布式架构保证一致性和可用性?
答:通常来说,是这样的。游戏要的是性能,一致性并不那么重要,因为公司并不会为此有多大的损失。甚至这还是有好处的,玩家不投诉客服的话,他的损失就归开发商了……
问:那游戏每次升级之后的开服岂不是得reload?随着服务器的增多 reload的数据,岂不是会上T?
答:不……游戏中要保存的数据并不多,而且游戏还有区的概念,可以保证游戏不会有太多的数据。还有就是,如果玩家 A 不上线,其实 A 的数据并不在内存。所以 reload 的时间也不会很多。
问:A 登陆成功以后从数据库拉玩家数据到内存,然后再也没有数据库交互,直到下线?
答:不是的,通常会在一定的间隔(比如 5 分钟),把状态有改变的玩家数据序列化到数据库或文件;下线以后,通常也会把玩家数据序列化到数据库或文件。
问:网游服务器端一般是 c++ 吧?java 估计很少:
答:啥语言都 OK 的。语言真的最不是问题的一环,比选择数据库系统还要简单。
问:erlang就不知道能干啥了
答:erlang 应该不合适吧,刚才说了,game svr 注重的是“顺序”,而 erlang 擅长的是并发,用了它不是“以已之短攻彼之长”么?
问:有没有啥开源的网游项目,可以拿来参考学习的?
答:MaNGOS?(http://sourceforge.net/projects/mangos/)MaNGOS is an object-oriented Massively Multiplayer Online Role-Playing Game Server (MMORPGS). It’s an educational project, to help developers get familar with large scale C++ and C# development projects.