Skip to content

原神的游戏服务器架构是怎么样的?

单机游戏

所有的代码逻辑都在用户那,因此用户就可以通过修改进程数据来达到作弊的效果。比如,当角色挂了的时候,观察哪部分进程数据发生了变化,我们就大概能猜出内存里哪个地方是控制复活次数的,将它改大,你就能实现无限续命。我相信你肯定玩过99 条命版本的「魂斗罗」和「超级玛丽」。

网络游戏

  • 简单的架构就是一个 GameServer 对应多个用户(早期网络游戏和现在小程序游戏服务端架构)
    • 但是用户直连游戏服务器,暴露了游戏服务器的 ip,会遭遇到攻击
  • 高级的架构引入 Gateway、Logingate、DBserver
    • 通过多个 Gateway去连接 Gameserver,Gateway 只负责简单的转发,一个Gateway只服务部分用户,崩溃了客户端重连,会走其他的Gateway上,从而让GameServer支持游戏角色掉线重连
    • Logingate负责处理第一次登录的用户请求,登录后,根据当前 Gateway 的人数分布情况,将用户分发到某个比较空闲的 Gateway 上,实现一定程度的负载均衡
    • DBserver:在 GameServer 的下一层,负责进行数据库写操作
  • 玩家多次登录游戏,用到的 Logingate, Gateway, DBServer 都可以是不同的,因为这些无状态,所以可以直接水平扩展(多复制几个实例)
    • 但是 GameServer 是有状态的,比如 Moba 类游戏,一场游戏的所有玩家应该在同一台GameServer 上进行游戏,否则很难进行,所以是有状态的,不能单纯水平扩展,并且因为多人同屏对战,技能释放时机,怪物或玩家角色死亡顺序都直接影响玩家最终的收益,所以它们需要有严格的先后顺序。这就导致了这类游戏,很多时候就是一个服务器大概几千人全都放在一个单线程里去执行游戏逻辑。
  • 新服的意思就是将(Gameserver, Gateway, DBserver, Logingate)为一组,平行扩展出非常多组这样的服务出来,服务器组与组之间完全隔离。比如经常看到的广东 1 区、上海 1 区。
  • 而原神这种,大部分时间都属于单机的游戏,所以 GameServer 也可以水平扩展。
    • 但是如果组队刷怪,需要一些中心服务器进行调度。
    • 如果玩家之间发生交互,比如 A 玩家要进入 B 玩家的大世界,那就让中心服务器控制将 A 玩家跳转到 B 玩家所在的 Gameserver 中,将两个玩家放在一个线程里去执行逻辑。
    • 而类似吃鸡和王者荣耀这种就是典型的房间类游戏,每一局游戏都会将限制人数n个人从游戏大厅转移到一个游戏房间里,实际上就是将n个玩家齐刷刷放到某个 Gameserver 中,通过单线程n个人的游戏逻辑跑起来。因此房间类服务器天然就是可以无限扩展的。
    • 还可以将不同的地图拆分到不同的 GameServer 中,更加精细化管理,避免卡顿等问题

正在精进