分享

[原创]龙之谷服务器构架结构设计实现分析

 sofes 2011-09-06

[原创]龙之谷服务器构架结构设计实现分析

分类: server game lua 2010-07-25 11:27 7186人阅读 评论(46) 收藏 举报
[原创]龙之谷服务器构架结构设计实现分析
by AKara 2010-07-24 @ http://blog.csdn.net/akara @ akaras(at)163.com

---------------------------------------------------------------------

  由于朋友介绍,周末陆续玩了两天 龙之谷(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端随机打乱,
这设定一定程度上分流了第一次选服的玩家(但对已有角色的用户来说,不方便);
也分流了每次进服后选频道的玩家(因为各频道共享角色数据,所以是等价的)。

---------------------------------------------------------------------

  先贴一下我初步猜测中的龙之谷的服务器部署结构图:
   龙之谷服务器结构
 
  然后下面是对这个猜测的一些分析过程的数据。
  希望同对这方面感兴趣的朋友也提供一些纠正或想法~

---------------------------------------------------------------------

  在 [进程开始->进入channel(的主城)->进入战斗副本->返回主城 ]
这四个游戏中经常经历的阶段中,可以观察到进程中的网络连接的变化:

(1) 进程开始
  tcp 连接一条,这里先称远端进程为gate。
  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中的场景跳转而已。

---------------------------------------------------------------------

  其实相比起这个服务器结构猜测;更应该总结的是游戏的各种优秀的策划设定。
抽空另写一篇总结一下。这游戏我应该还会继续玩下去*_*。

---------------------------------------------------------------

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多