不知不觉进入游戏行业工作已近一年,在这一年的时间里,除了繁忙的完成策划的逻辑需求,我也一直在思考一个问题:一个支持横向扩展的mmo游戏服务器,其底层实现到底是怎样的呢?当然,既然都已经在公司待了近一年时间,对其架构和实现肯定都是有一定了解了,但是没有具体实现过,永远都只是纸上谈兵,对其思考总不可能深入。更何况造*是程序员的乐趣之一,还可以锻炼自己的技术能力,*接触自己想接触的技术细节,何乐而不为呢?因此,深思良久,今天在此决定开一个《自己动手从零写mmo游戏服务器》的系列,用来记录自己从0开发的历程。
技术选型
服务端使用C++做底层引擎开发语言,暴露接口给Python写逻辑层脚本,客户端使用Unity, C#搭建一个小场景,包括主角和一个大的平面,简单的用于验证服务端的功能即可。
基础架构
服务端采用多进程架构,即流行的 多Gate + 多Game + n个单点管理进程(Manager),Gate类似于其他IT领域里的消息队列MQ,负责与玩家客户端的连接,将客户端的消息请求分发到玩家实体对应的Game进程;而Game负责游戏相关的逻辑计算,并将计算结果通过Gate发送到客户端。可以看到,Gate实际上充当了客户端与Game进程连接的一个代理Proxy,那为什么客户端不直接连接到Game呢?这个后续再继续分析。除了核心的Gate + Game外,还需要有数个单点管理进程,主要用于跨Game间的通信和全服的管理。
技术点
显然,从零开始写游戏服务器,需要设计很多技术点,从最基础的网络通讯到高层的mmo游戏基础逻辑(属性同步,RPC,AOI,位置同步策略...),我们需要一一实现,在此我从底层到高层,将所需的技术点列一个表,今后的开发进度也围绕这个表进行,逐步完成我们的游戏服务器。(该表可能会随着自己理解的加深不断补充变化)
基础网络通信功能
该部分不准备从0写起,准备基于boost.asio进行开发,主要是因为不想纠结于不同平台的通信api和模型,这种脏活累活既然已经有人帮我们做了,那我们就直接利用起来吧。另外为了快速搭建原型,暂时不去管复杂的网络状况,我们假设网络是像局域网这样的优良网络,因此我们直接选用TCP协议进行开发。RPC调用
RPC是服务器间通信的基本方式,实现RPC涉及到存根stub的自动生成方案,以及通信协议的确定,可以考虑json格式或者protobufGate + Game的基础架构
在以上基础上,搭建出Gate + Game的基础架构,实现客户端与服务端的通信基础游戏逻辑
包括属性同步、AOI、位置同步等等,走到这一步,一个mmo游戏服务器的demo就出来了其他功能
包括数据库、寻路、场景划分等等,这些都是后话了
计划
目前计划每周更新一篇,记录开发进展和技术难点,开发进度视工作繁重程度而定。。。