前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从MapleStory谈游戏状态同步

从MapleStory谈游戏状态同步

作者头像
企鹅号小编
发布2018-01-25 15:09:36
2K0
发布2018-01-25 15:09:36
举报
文章被收录于专栏:应用案例应用案例应用案例

前言

单机版基本上做了很多功能了,现在开始进入了网络版,最近一直在做一个功能,玩家的状态同步,在做这个功能的时候遇到了一些坑,因此总结记录一下。

背景

在一个网络游戏当中,特别是RPG类的游戏,尤其需要同步玩家的状态(包括地图中其他怪物的状态),如果状态不相同,则会使得每个玩家所显示的东西不同,这样就失去了联网的意义,因此如何设计好一个状态同步,是一个RPG类游戏的核心技术之一。

玩家状态同步

1

基于帧的状态同步

在开始设计的时候,没有考虑很多,为了简化操作,使用了基于帧的状态同步,在这种模式下,即当地图中玩家的状态发生改变,就立即往服务器发送一个状态数据包,然后通过服务器广播给当前地图中的所有玩家,其他的客户端收到该数据包后解析并设状态。这样的做的优势很明显,简单粗暴,同时状态信息准确。但是仔细分析之后,这样的做法增大了服务器的压力。

举个例子:在当前的游戏中,游戏的更新速率为 120 FPS,即一秒钟更新120次。如果玩家静止不动,则不需要发送数据包,但是如果玩家处于移动状态的时候,一秒钟会向服务器发送120个数据包,同时服务器需要广播(120*PlayerCount– 1)个数据包,

假设一个数据包的大小为10 bytes,一个地图有10个玩家(包括自己),那么服务器的带宽为12kbps ,十分消耗服务器性能。因此考虑在移动平台下,这种方式不可取。

2

基于预言的状态同步

由于每一次移动或者改变状态都需要发送数据包,消耗服务器性能。通过观察官方设计,使用基于预言的状态同步。

实现前提:可接受的延迟(RPG类游戏可接受200ms左右的延迟)

官方设计:官方设计实际上实现的十分精巧,将一个 玩家/怪物 的移动拆分成了一个移动片段(MovementFragments),在每个片段中,包含了当前的位置,下一次的位置和时间。即

struct MovementFragments {

Int16_t x;

Int16_t y;

Int16_t nextX;

Int16_t nextY;

Int16_t duration;

}

在当前的客户端中,通过当前的位置(x,y),和当前的速度(speed),产生一个随机的时间duration (duration ∈(0,510)),通过这些参数算出移动过后的位置:

nextX = x + speed * duration;

nextY = y + speed * duration;

当其他客户端收到该数据包之后,通过数据包的值,算出玩家的速度,同时移动。

OtherPlayer.moveToUntil(nextX,nextY,duration);

同时在官方的设计当中,一秒钟将一次状态改变拆分成了5次片段,片段的是消耗时间为一个随机值,但是总时间为510毫秒。因此在一次更新速度为120FPS的游戏当中,一秒钟只需要发送10个数据包,大大缓解了服务器的压力。

怪物状态同步

在一个地图当中,玩家的状态同步之后,则需要同步地图中怪物的位置信息,怪物的位置信息同步方式一般有两种实现方式

1

基于客户端的状态同步

一个地图中的怪物状态,实际上是由地图中玩家所决定的,当玩家施加攻击、使用技能,都会改变怪物的状态。在MapleStroy的设计当中,怪物的位置计算是属于离线计算,这也就是说,服务器不参与怪物的状态,这样的好处是节约流量、减缓服务器压力,但是坏处是,会出现怪物静止、吸怪等外挂手段。在移植MapleStroy的过程中,为了同步官方和考虑移动平台流量问题,因此采用此种手段。

实现策略:

怪物的位置由第一个进入该地图的玩家决定。这也就是说,当第一个玩家进入该地图之后,控制着当前地图中所有怪物的移动状态。当第二个玩家进入该地图之后,第一个玩家会广播当前所有怪物的状态,第二个玩家根据这些数据包进行改变。当然其他玩家发生了攻击,或者激怒怪物的操作后,也会广播这个消息。

同时怪物的移动也是采用基于预言的状态同步,大体实现和玩家移动相似。

02

基于服务器的状态同步

服务器的状态同步原理很简单,服务器保存并控制着怪物的状态,因此当一个地图中有多个玩家的时候,广播当前的状态即可。

同步效果:

本文来自企鹅号 - 冒险樢媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 冒险樢媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档