龙之谷服务器构架结构设计实现分析
由于朋友介绍,周末陆续玩了两天 龙之谷(http://dn.sdo.com)。
如果一个网络动作游戏可以打10分,那截止现在,我至少给它9分左右的高分。
无论从手感,动作技能设计,网络流畅度,场景风格,角色塑造,玩法设定,
新手引导,MM亲和度等方面来看,均属上乘之作。
强烈推荐喜欢玩动作类网游的朋友尝试一下。当作3D版的,更好玩的 DNF 吧。
我选了[华南电信二区] -> [3服-烈焰风暴]。角色名 AKara ,欢迎来组。
看来盛大又代理了一个能赚大钱的宠儿。
好的游戏,不妨玩的过程顺便猜测一下它的实现。
---------------------------------------------------------------------
从7月22日11点到7月24日晚,游戏开了22个大区(电信16个,网通6个,教育网0),
每个大区分为4个独立的数据服分区,玩家数据在这4个服内不能互通。
见 http://dn.sdo.com/web7/home/serverstat.asp
【下面的分析都针对我选的大区来进行】
dnlauncher.exe是选区和patch下载器,选定大区后,其他操作都在主进程。
DragonNest.exe是主进程,由dnlauncher.exe创建。
貌似龙之谷client脚本用Lua?
主进程中的服列表是每次登陆都随机排序,而每个服下的频道列表也是随机
排序。这个随机应该是client对http下载回来的tree内容的client端随机打乱,
这设定一定程度上分流了第一次选服的玩家(但对已有角色的用户来说,不方便); 游戏编程 2009FLY文摘,正正博客 WWW.2009FLY.COM
也分流了每次进服后选频道的玩家(因为各频道共享角色数据,所以是等价的)。
---------------------------------------------------------------------
先贴一下我初步猜测中的龙之谷的服务器部署结构图:
然后下面是对这个猜测的一些分析过程的数据。
希望同对这方面感兴趣的朋友也提供一些纠正或想法~
---------------------------------------------------------------------
在 [进程开始->进入channel(的主城)->进入战斗副本->返回主城 ]
这四个游戏中经常经历的阶段中,可以观察到进程中的网络连接的变化:
(1)进程开始
tcp 连接一条,这里先称远端进程为gate。 copyright 2009fly 2009FLY文摘,正正博客 WWW.2009FLY.COM
gate负责帐号验证,大区下的服务器组选择,创建新角色,选择角色等功能。
试验多次,发现gate至少存在存在下面的6个。可看到每个服务器部署两个gate。
119.147.185.98:14300
119.147.185.98:14301
119.147.185.85:14300
119.147.185.85:14301
119.147.185.86:14300
119.147.185.86:14301
http连接多条,估计用于下载分服信息的tree。
(2)进入channel(的主城)
此时client与gate的连接断开。
并建立tcp新连接一条,这里先称远端进程为channel。
经试验,1~9级的普雷利镇被划分为下面20个line(不用channel来命名,避免混淆)来分流:
(A)
line_1:119.147.185.71:14401
line_2:119.147.185.71:14401
(B)
line_3:119.147.185.71:14402
(C)
line_4:119.147.185.71:14403
line_5:119.147.185.71:14403
line_6:119.147.185.71:14403
(D)
line_7:119.147.185.71:14404
line_8:119.147.185.71:14404
line_9:119.147.185.71:14404
(E)
line_10:119.147.185.72:14401
line_11:119.147.185.72:14401
(F)
line_12:119.147.185.72:14402
line_13:119.147.185.72:14402
line_14:119.147.185.72:14402
(I)
line_15:119.147.185.72:14403
line_16:119.147.185.72:14403
line_17:119.147.185.72:14403
(J)
line_18:119.147.185.72:14404
line_19:119.147.185.72:14404
line_20:119.147.185.72:14404
而9~16级的凯德拉关卡现在则只有12个line来服务它:
(B)
line_1:119.147.185.71:14402
(C)
line_2:119.147.185.71:14403
line_3:119.147.185.71:14403
(D)
line_4:119.147.185.71:14404
(E)
line_5:119.147.185.72:14401
line_6:119.147.185.72:14401
(F)
line_7:119.147.185.72:14402
line_8:119.147.185.72:14402
(I)
line_9: 119.147.185.72:14403
line_10:119.147.185.72:14403
(J)
line_11:119.147.185.72:14404
line_12:119.147.185.72:14404
选择竞技场channel则有12个line:
(B)
line_2:119.147.185.71:14402
line_2:119.147.185.71:14402
(C)
line_3:119.147.185.71:14403
line_4:119.147.185.71:14403
(D)
line_5:119.147.185.71:14404
line_6:119.147.185.71:14404
(F)
line_7:119.147.185.72:14402
line_8:119.147.185.72:14402
(I)
line_9:119.147.185.72:14403
line_10:119.147.185.72:14403
(J)
line_11:119.147.185.72:14404
line_12:119.147.185.72:14404
总结一下上面的line和channel信息,
可以大致看出,龙之谷一台服务器上一般部署了4个左右channel进程,
而每个channel进程合并了5~7个左右的line逻辑。
目测估计每个line逻辑承载的人数不应该超过500,就算它300吧。
PS:单进程超过2100人的7分割场景在线(一台服务器就2100*4=8k人)。
由于高级line的人数不满,竞技场的人数不多,
安照上面的配比,就算每个line承载1/2负荷,即150人。
那可以粗略保守估算一下龙之谷现在的最高在线人数:
22大区 * 4小服 * 32个line * 150人/line = 42w
也就是每个大区有约1.9w玩家在线。
(3)进入战斗副本
此时client与channel的连接断开。
并建立tcp新连接一条,这里先称远端进程为war。
经试验,war并不多:
119.147.185.70:14500
119.147.185.63:14500
119.147.185.64:14500
119.147.185.65:14500
119.147.185.69:14500
如此看来,一个小服内只有5台机器服务它的战斗。
用上面的估算人数来粗略平均一下,就是平均每个war进程负荷1000人的副本战斗。
如果是组队进入战斗副本,则除了原有的TCP的关键消息同步,
还建立了每个玩家和war之间的UDP通讯方式(并非p2p),
应该只用于同步非关键动作和移动。
龙之谷只允许最多4个人的组队。
留意了一下这个UDP信道的通信量:
两次2人组队关卡:
858k/12min(平均1220byte/sec)
877k/10min(平均1496byte/sec)
一次4人组队关卡:
706k/6min(平均2008byte/sec)
而如果是单人进入战斗副本,则完全只和war进程有tcp网络通信:
怪物AI完全是服务器驱动的。
玩一个关卡大概8分钟,因为跑地图花去时间,加上过地图的加载。
下行 100k(平均213byte/sec), 上行90k(平均192byte/sec)。
(4)返回主城
此时client与war的连接断开。
重新与某个channel建立连接。
这里的"某个"其实就是之前(1)阶段中的那个channel。
有一个假象就是:AKara角色 从 1~9级的普雷利镇 经过副本到底 9~16级的凯德拉关卡 后,
会发现client中的line竟然 从12号 变成了 7号。
但参照上面的channel ip:port便能发现这两line属于同一个channel进程:
普雷利镇 line_12:119.147.185.72:14402
凯德拉关卡 line_7: 119.147.185.72:14402
PS:
龙之谷的同一个channel进程中的line之间的切换,是不需要断连接的。
但是,不在同一个channel进程中的line之间的切换,是断旧连新的。
这样归并多个line实现到一个channel进程的好处是,这几个line之间可以进行
某些形式的互动,比如组队:和同channel其他line的玩家组队,会实时跳转line。
本质上相当于MMORPG中的场景跳转而已。
---------------------------------------------------------------------
其实相比起这个服务器结构猜测;更应该总结的是游戏的各种优秀的策划设定。
抽空另写一篇总结一下。这游戏我应该还会继续玩下去*_*。
---------------------------------------------------------------------
龙之谷服务器构架结构设计实现分析相关推荐
- [原创]龙之谷服务器构架结构设计实现分析
[原创]龙之谷服务器构架结构设计实现分析 by AKara 2010-07-24 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @ wei ...
- 龙之谷服务器显示不了游戏,龙之谷服务器爆满 游戏进不去怎么办解析
龙之谷服务器爆满 游戏进不去怎么办解析 来源:www.18183.com作者:雾里看海时间:2017-03-06 龙之谷服务器爆满 游戏进不去怎么办?很多新玩家进入游戏的时候会发现前面的区都进不去,本 ...
- 龙之谷服务器显示不了,龙之谷服务器爆满 游戏进不去怎么办解析
龙之谷服务器爆满 游戏进不去怎么办解析 来源:www.18183.com作者:雾里看海时间:2017-03-06 龙之谷服务器爆满 游戏进不去怎么办?很多新玩家进入游戏的时候会发现前面的区都进不去,本 ...
- 盛大游戏李阳:龙之谷服务器设计
原文链接:http://www.gameres.com/779278.html 9月23日,首届"梦想·匠心"腾讯游戏开发者大会于深圳举行,在技术分论坛上,盛大游戏<龙之谷& ...
- 龙之谷服务器仓库在哪个位置,全区全服版本更新至Ver.190
各位亲爱的玩家: <龙之谷>全区全服已维护完毕,版本更新至 Ver.190.由于 华东电信四区 和 南方电信一区 已提前更新至Ver.190,故这两个大区仅为例行维护.也已维护完毕.请玩 ...
- 龙之谷服务器更新文件,全区全服 维护结束 更新至Ver.417
本帖最后由 一尾双鱼 于 20-5-22 17:50 编辑 各位亲爱的谷迷: <龙之谷>于 2020/05/21 早上07:00 开始对 全区全服 进行 更新至Ver.417. 目前服务器 ...
- 记一次《龙之谷》手游代码分析
目录 <龙之谷>手游挺垃圾的代码 首先,工具乱糟糟 其次,用的Unity4.6~4.7的版本 另外,发现使用了slua ulua + tolua的组合 其他,后面补充 主要场景渲染效果如下 ...
- 龙之谷如何找回服务器,龙之谷服务器忘了怎么办 服务器连不上解决方法
信号问题:你所在的位置可能信号很弱,仅有2G,这样的信号情况下,玩什么游戏都卡,不仅仅是龙之谷会这样了.建议移动下位置,或者更换一个网络,使用wifi. 授权问题:你的QQ设置授权出了问题,在QQ里面 ...
- 龙之谷服务器互通信息,龙之谷5月10日华南电信二区服务器互通
各位亲爱的玩家: <龙之谷>将于5月10日07:00对华南电信二区进行服务器互通升级,预计升级时长为4个小时.请留意官网信息,我们将通过官网公告告知结束时间. 本次华南电信二区具体互通升级 ...
最新文章
- python 把列表或者元组转成集合
- 十一、explain属性介绍
- yum安装nginx的负载均衡详解
- PHP中的foreach遍历数组
- A Greeting from Qinhuangdao Gym - 102769A 2020ccpc秦皇岛分站赛
- LeetCode 278. First Bad Version
- python定义栈_Python栈实现
- 最简单的嵌套循环,一句话即可。适合repeater,dropdownlist,gridview等等
- antd的table遍历之后添加合计行_付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具...
- linux查找某个命令属于哪个rpm包
- 关于MATLAB实现的数字信号处理(四)
- AcWing 900. 整数划分(完全背包计数问题)
- linux下的备份管理rsync
- [Java]HashMap的两种排序方式
- python 手机号码识别_python3库可以识别电话号码、姓名、电子邮件和地址
- lamp一键安装包不安装mysql_LAMP一键安装包安装与配置
- uvm transaction
- MacOS 连接网络打印机后一直不能打印
- java 图片画框并读取成base64数据
- 支付宝支付返回resultStatus:4000(系统繁忙,请稍后再试)
热门文章
- 怎么使用命令行查看mysql版本号_查看MySql版本号命令
- 什么是Three.js?(一)
- 解决“chrome正受到自动测试软件的控制”信息栏显示问题-V76及以上版本
- html5 阿狸照片展示,沫子晒5年前cos阿狸照片,又粉又嫩颜值高,而粉丝只关心36D...
- 超全的12种数组去重的方法
- 6个月Linux周末班学习计划书
- Adobe InDesign CC 2019 14.0.2 中文特别版 Mac 印刷和数字出版的版面设计软件
- java 数组的创建 与 赋值
- 核心动画——Core Animation
- 【矩阵分解二】FunkSVD