游戏服务器基础设计文档和规范

2016.9.12 游戏服务器基础设计文档和规范

基本概述
  • Java作为主要开发语言
  • 游戏服务器为单进程多线程的结构
  • 项目采用gradle进行构建
  • 数据库为mysql 5.7
  • 网络层采用netty 4.1.4.Final
  • 协议层采用protobuf-java 3.0.0
  • 数据层目前采用spring-jdbc 4.3.2.RELEASE
  • 支持hotswap(通过类重定义实现)
  • 支持在线执行逻辑代码(在内存中执行一段逻辑代码)
  • 支持游戏逻辑脚本(通过groovy作为内置脚本)
线程模型
  • 主逻辑线程
    • 目前主要执行玩家不在场景的逻辑以及后续的一些全局逻辑业务
    • 直接利用JDK自带的单线程池实现
  • 逻辑线程池
    • 提供了两个模型,"分线"和"分场景"两种模型
    • 分线模型即客户端与server建立连接后即将某个玩家固定到某个线程
    • 分场景模型即根据场景进行划分,一个线程管理多个场景
    • 尽量保证每个玩家的逻辑是单线程的
    • 玩家之间的交互通过互相投递消息来实现
    • 消息是放在玩家的消息队列中然后通过外部的线程驱动来执行消息
  • 场景、分线调度线程
    • 用来驱动整个游戏逻辑
    • tick/heartbeat
    • 目前基于固定sleep
  • 异步线程池
    • 所以的io耗时操作全部在异步线程池执行,然后异步回调调用线程
    • 防止阻塞逻辑线程
    • 如数据库操作,网络层操作,本地磁盘操作
  • 调度线程
    • 用来一些长时间的时间调度任务,如定时存盘等
  • IO线程池
    • Netty的Boss-Worker模型
Tick
  • 场景调度器

while(!stop)
{
    sceneExecutors.foreach(sceneExecutor.manageScenes.forEach(scene.tick))
    sleep(25)

    println isDoneAllIn25ms

    sceneExecutors.foreach(sceneExecutor.manageScenes.forEach(scene.tick))
    sleep(25)
    
    if(isNotDoneAll) println "busy"     
}

  • 场景tick

processMessage
    -> 遍历场景内玩家身上的消息队列,每次最多处理15条
processHeartBeat
    -> 处理场景内玩家的心跳
        处理和关键相关的业务心跳
    -> 处理场景内其他心跳(npc、怪物等)

  • 网络层收到消息处理

if(player.isNotInScene)
    主线程执行该消息
else
    消息直接扔到玩家的消息队列(由玩家所在的场景的线程去执行)
逻辑开发人员如何写逻辑
  • 制订协议和时序图
    • 由server制订逻辑协议,编辑.proto,主要是定义协议号和协议号对应的消息体
    • server制订逻辑时序图交互
    • 和客户端同学根据协议和时序图以及逻辑来修改和确定协议和时序图
    • server将协议源文件上传,通知客户端更新(外链),通过工具生成客户端协议
    • server端也根据协议工具直接将协议生成在cavs-game-proto工程
    • 双方各自开发、调试
  • 建议server端核心逻辑和关键模块要画类图
  • server实际开发
    • MessageType中注册消息号、消息体和消息处理器三者之间的关系即可
    • 从消息处理器写逻辑即可
    • 目前大部分逻辑不用担心线程安全问题,比如单个玩家的逻辑,多个在同一个场景的玩家交互逻辑等
    • 建议和玩家的逻辑管理器全部挂在角色上,如背包管理器、货币管理器等
      • xxManager,xx为逻辑模块
      • 该业务的逻辑数据并提供基础方法
      • 消息处理器调用逻辑管理器的相关方法
    • 建议非玩家个人逻辑以xxService命名,xx为逻辑模块
    • 两个玩家不在同一个场景之间的逻辑交互通过玩家之间的消息队列互相投递消息实现
    • 尽量面向接口编程
  • 时序图例子
    • 登陆时序图
待优化及改进
  • 无锁队列的引入
  • 分布式日志系统的引入
  • tick模型的优化
  • 根据压力测试决定是否拆分多进程(更方便的扩展为多进程)
  • 服务器的性能基准测试
  • 引入缓存中间层
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 前言 mmoprg,即大型多人在线角色扮演游戏,其典型的游戏有:UO :《网络创世纪》、传奇、奇迹MU、WOW、剑...
    tryingpfq阅读 1,673评论 0 1
  • 原文:https://www.cnblogs.com/hwcs/p/7203605.html 一、游戏服务器特征 ...
    Golang语言社区阅读 1,475评论 0 4
  • 首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它...
    Designleiou阅读 2,512评论 0 3
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,454评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,793评论 4 1