目录:

MMO游戏服务器从零开发(架构篇)

MMO游戏服务器从零开发(架构篇)- 网络部分


MMO游戏服务器属于大型多人在线游戏服务器,负载,稳定,效率(包括反馈延迟和开发效率)是这种服务器基本要求。

本人从10年入行至今一直从事MMO游戏的研发和架构设计工作,对此类服务器有一些理解和见解。下面分享给想了解游戏服务器开发的朋友们。这些是本人这些年来对MMO服务器架构设计的总结的分享。本人会从头开发一套完整的MMO服务器架构程序。并在架构的基础上实现基本的游戏Demo功能。虽然只是架构,但是完全可以支持线上项目的研发。本人是实战中成长起来的,不会花哨的语言修饰。都是真枪实弹的code。

开发语言选择:

本人参与C++服务器架构开发5年,后转Java,发现Java更加适合游戏服务器的研发。优点如下:

1、相对简单,远比c++要容易些,这个应该不用争辩吧。并且Java的人员招聘也比C++要容易些。

2、服务器稳定,C++服务器动不动出现指针等问题就可能导致服务器宕机,但Java有的异常处理机制可以处理几乎所以因为简单异常导致的问题,出现引用问题,也只是抛出一个异常打印即可。

3、开发编译效率。Java的库比较完善(C++库也很完善),但去网上查询多少开源的java库和多少开源的c++库,对比就知道了。相同的功能,用Java去写逻辑比C++写逻辑代码要少,这是我的感受。c++写类需要H文件和CPP文件,并且需要先定义后实现,这就要多写一个函数定义。编译,C++项目的链接机制很耗时,一个完善的大型游戏服务器项目重新编译一次,动不动就是10分钟半个小时以上,有人会不会说不用联编啊,我上个项目在使用联编的条件下需要10分钟以上,不用联编时间就不用提了,每个半个小时肯定编译不完。但Java就快的多了,Java是生成的字节码,并且没有链接的过程。比如修改一个函数,Java添加完成,可以直接启动测试,但是C++就可能会因为一行代码的修改,导致无数Cpp文件的编译。这个过程十分耗时。这是我比较推荐使用Java开发的主要原因。因为项目开发的大部分时间还是逻辑功能的开发。如果因为编译过程消耗大量时间,后期的开发维护成本大大减低。

4、效率对比,有人可能说C++比Java运行效率高,这个我不争辩。网上争辩的太多,现在的机器性能已经足够高,不够就堆积硬件,硬件成本远低于软件成本。也不是说Java确实效率不行,实际上Java和C++效率对比已经可以忽略。比如相同程序,C++跑1000万次耗时1秒,Java耗时0.9秒。虽然慢,但是1000万次的数量级,完全没有必要非得争取那0.1秒。但也是分领域。比如游戏内部寻路算法NavMesh,这种纯运算的逻辑还是用C++,确实效率高。通过Java的Jni方式与本地C++Dll实现交互,Java调用C++方法。

5、跨平台问题。就说Window和Linux,C++编写的代码在不同的平台要有两份实现。就仅仅网络部分window的Iocp,linux的Epoll就是两种实现。其他的函数库,两个平台也有不同,都要进行处理。对于Java,就一个虚拟机,在window还是在linux都是运行在虚拟机之下,只要有Java虚拟机,管你是什么系统。

模块介绍:

虽然只是服务器架构,但是麻雀虽小,五脏俱全。先整体介绍一下MMO服务器需要的基础组成部分,让大家有一个整体的认识。

基础组件:

1、网络组件:包括内网通信模块和外网通信模块。还有协议部分。

2、数据库组件:负责玩家数据和全局数据的持久化。

3、日志组件:包括异常日志(代码异常打印日志)和行为日志(为运营平台提供的行为日志)。

4、配置读取组件:程序启动配置(程序启动相关配置如ip,port,连接关系等这个很简单,使用ini配置即可)和游戏相关配置(游戏逻辑相关配置使用量巨大,采用json格式数据)。

游戏逻辑模块:

以上组件都是为了这部分的做支撑。这个部分也是代码量最大,使用量最大的部分。这部分还可以细分出很多模块。具体模块后续详细说明。游戏逻辑模块主要分成两部分线程组:系统服务线程组和场景逻辑线程组。不同的系统服务器挂载不同的服务线程上,不同的场景挂载不同的场景线程上。

系统服务包括哪些:比如登陆系统服务,好友系统服务,帮派系统服务,等。可以将一个或者多服务器挂载一个线程,也可以分别挂载不同线程。根据预测的逻辑运算量进行分配,同步配置文件可以实现配置挂载。

场景逻辑:玩家的所有操作基本都属于场景逻辑线程组的。玩家的行走,战斗,道具获得,使用。系统服务线程组提供的系统服务基本都是通过RPC调用的方式为场景逻辑组线程提供服务。比如添加好友,场景逻辑线程上的玩家收到添加好友消息,然后通过Rpc的方式调用系统服务器线程组的好友服务实现添加好友功能。但登陆服务做了特殊处理,登陆消息会直接分发到登陆服务,登陆服务进行验证,验证通过后会在场景服务线程组创建对应的角色通信对象实现与客户端的通信处理。

进程划分:

之前做C++的时候,一般都把进程都可以划分为登陆进程,网关进程,游戏逻辑进程,数据库进程,日志进程,平台进程。但转Java后,发现启动多进程反而启动麻烦。由于服务器架构整体都是多线程架构,就没有做细致的进程划分,我们的服务器可以全部都开在一个进程上,也可以分开启动。我们最近上的项目就是所有功能都在一个进程启动,开服第一天开了10几组服务器,由于导量的不均匀,导致首服人数特别火爆,最初设置的最高在线人数初始都是3000人,最后将首服调整为5500人。因为硬件都是试用云服务器,足够的大内存,cpu,完全没有必要分开进程启动,多进程反而会消耗更大的内存和cpu,单进程多线程更优。运维启动也更方便。

PS:本文是从整体到部分的实现步骤,所以难免有部分细节介绍可能存在一些疏忽或者问题。希望大家可以及时反馈,本人之后也会再发现问题修改本文的部分内容。

MMO游戏服务器从零开发(架构篇)相关推荐

  1. MMO游戏服务器从零开发(架构篇)- 网络部分

    目录: MMO游戏服务器从零开发(架构篇) MMO游戏服务器从零开发(架构篇)- 网络部分 游戏服务器的网络分为2部分: 外网通信:服务器与客户端进行的网络数据交互. 对于使用java外网通信毋庸置疑 ...

  2. 游戏服务器Mina框架开发

    游戏服务器Mina框架开发 作者:老九-技术大黍 社交:知乎 公众号:老九学堂(新人有惊喜) 特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权 前言 如果要使用Java语言来开发游戏 ...

  3. Java游戏服务器成长之路——感悟篇

    又是一个美好的周末啊,现在一到周末,早上就起得晚,下午困了又会睡一两个小时,上班的时候,早上起来喝一杯咖啡,然后就能高效的工作一整天,然而到了周末人就懒散了,哈哈. 最近刚跳槽,到新公司已经干了有两周 ...

  4. golang游戏服务器项目,基于Golang的游戏服务器框架cellnet开发日记(一)

    启程的故事 使用Golang写服务器是一件非常幸福的事情. 不用长时间的等待编译, 零依赖部署. 开发效率高, 多出的时间陪陪家人, 看书充充电多好. 所以Golang就像是手机界的苹果, 从发布后, ...

  5. 利用游戏服务器引擎Matchvs开发联网微信小游戏

    Matchvs是一款十分易用的游戏服务器引擎,开发者通过SaaS层提供的API,即可完成"就近"节点接入.玩家匹配.游戏数据通信的建立:PaaS提供GS开发框架.托管平台,无需自有 ...

  6. mmo游戏服务器性能指标,关于performance:厚积薄发MMORPG手游合理的性能参数

    1)MMORPG手游正当的性能参数 ​2)应用ScriptableBuildPipeline打包的疑难 3)如何获取到Animation批改材质球色彩后的色彩值 4)嵌套预设AssetBundle打包 ...

  7. java 039 s rule_Java开发架构篇:DDD模型领域层决策规则树服务设计

    沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅仅只是从一个简单的分层结构上依然没法理解DDD以及如何去开发 ...

  8. 《从零开始搭建游戏服务器》Linux开发环境配置

    前言: 之前的开发工作一直是在Windows开发环境下进行的,但是正真发布和外网运营势必要发布到Linux环境下,而且有很多服务端的工具对于Windows系统的兼容性并不是非常完善,就像常用的Dock ...

  9. 解码mmo游戏服务器四:如何实现玩家状态的高同步性

    问题引入:这里主要讨论状态同步,client A发生状态变化(移动,换装,属性变化等),将变化的信息同步到client B,最简单做法就是直接通过服务器中转然后广播出去,但是由于存在网络延迟,所以cl ...

  10. 华为鸿蒙2048小游戏,《从零开发鸿蒙小游戏App》直播答疑(包含新版2048游戏代码)...

    请到附件中下载新版2048游戏代码.最好能对该代码再做一些优化(见下述问题8),欢迎感兴趣的朋友随时跟我探讨,^_^ 问题1:如何将开发的Lite Wearable项目部署在鸿蒙手表Watch GT2 ...

最新文章

  1. 挑战蓝牙/Wi-Fi NFA争食无线音频应用大饼(转)
  2. 基础篇-verilog-实现循环左移右移
  3. Python数据结构与算法(第一天)
  4. Android 创建,删除,检测桌面快捷方式
  5. CentOS6.3 重启后/etc/resolv.conf 被还原解决办法
  6. 电气专业学python吗_985大学毕业起薪最高的五个专业,计算机、金融、电气上榜!...
  7. 从文件夹内批量获取所有文件名 批处理脚本
  8. notepad 没有plugin manager_和平精英巅峰赛正式开启,热度却没有象中那么高!
  9. Gradle_04_解决多项目同级依赖时找不到符号的异常
  10. 知易游戏开发教程cocos2d-x移植版
  11. 资深影迷不可不知的宽高比:Aspect Ratio 电影画面比例
  12. 企业财务报表分析【1】
  13. HCIP-三层网络架构实验
  14. Mina中的多项式承诺方案
  15. 点击屏幕其他地方让edittext失去焦点 的实现
  16. android 轮换实现动画,怎么在Android中实现一个首页无限轮播功能
  17. Wi-Fi基带芯片和Wi-Fi无线网卡设计方案
  18. 读《互联网创业的四种玩家》有感
  19. 雷士照明股权连环局(第一、二、三季完整版)
  20. CISP与CISP-PTE有什么区别?

热门文章

  1. 内存卡删除的文件如何恢复?如何恢复比较快?
  2. 虚拟机安装Windows11正式版
  3. 计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解
  4. 一个JSP页面打开另外一个JSP页面并传值
  5. Python学习笔记之八皇后问题
  6. speedpdf——PDF转PPT免费在线转换还不限制页数哦
  7. Y400本本SSD装win10与机械硬盘上的系统组成双系统
  8. 一个简单的例子来理解监督学习和非监督学习及其区别
  9. marked 用户手册 在线查看
  10. linux系统软路由软件,Linux软路由配置