某个周一上班,项目经理在项目组里定了个目标:实时对战开搞,两周后能在手机上撸一把。

负责客户端的同学和我表示震惊。WTF,两周内做完,没啥思路,咋搞~!@#$%^&*()

先对实时对战的难度作一个大概的描述吧。时下挺流行的一款手游——拳皇98online,其实时对战属于回合制,设计起来较为简单。即便如此,人家开发也是用了几个月时间,刚上线的时候还出了很多bug,回炉重造也花了快两个月。而我们的项目属于RTS(及时策略模式)游戏,各种指定都是同时释放的,设计起来难度也大了很多。

以前在旧公司的时候,虽然也接触过实时对战。然而我对pvp同步只停留在“看过猪跑”的概念,要自己动手,发现也是无从下手。

作为一名光荣的程序猿,我觉得不能因自己没做过,就轻易say no,丢给其他同事。只有接受一些有挑战性的工作,我们才能强大起来。

接了需求,查了好久资料,也请教了一些有经验的同学。两天后,开始coding...

网上关于实时对战的功能不算少,但过于理论化,碎片化。而且同样一篇文章,却有很多不同的url(程序员喜欢一字不漏复制粘贴代码,文章也不放过)。在这里,我希望对我的实现作一个总结,争取尽量将设计思路步骤化,剩下的实现细节就不展开了。

Given much time, it works perfectly;Given little time, it can only work.

目前游戏的战斗同步,主要有两种。一种是状态同步,主要运用于MMORPG类型的游戏。另外一种是帧同步,只要用于RTS,FPS游戏。

在两周时间内,我们设计的pvp只能是类似帧同步,只做转发,基本能够打得起来就可以了。基本跑起来的定义是什么,至少两个人打同一场比赛,看起来画面差不多一样,而且不能出现在各自的屏幕里对方都输了,那就尴尬了。

实时对战是一个大工程,如果不考虑弱网性和客户端作弊,那服务端设计就非常简单了,因为它只需要针对以下几个方面作消息转发就好了。

一、位置同步

游戏中两人的行走,是同步的基础。由于策划强烈要求顺畅性,我们只好采用弱同步了,只要玩家在本地产生了移动指令就能行走。方法是这样的,客户端A以一定的频率(例如200ms一次)将移动指定发送到服务端,然后服务端再转发给对方客户端B。其实这里就出现了延时,延时在A发包到服务端所用时间以及服务端下发到客户端B所用时间之和。在本地局域网延时可忽略不计,后面会有改进。

二、技能同步

同样因为要求顺畅性,所以只要客户端验证通过(CD和攻击范围等等),就应该同步技能了。这里又出现了跟位置同步同样的延迟了。这里有个策划方面的技巧,如果策划设定技能的释放能有一个起手动作时间,那么这一小段动作时间就可以隐藏网络延时带来的时间差。释放一个技能,首先播放一个技能起手动画,然后马上发出指令。理想情况,当动画播完了,双方刚好收到技能释放包,于是一个技能完美地在双方客户端释放了。在这里吐个槽,实时对战由于网络延迟存在的客观性,策划应该想方设法通过一些规则隐藏一些弊端,而不是坚持己见,一旦程序实现不了就说他们的开发太水。=。=

三、血量同步(死亡同步)

血量同步包括技能产生的伤害以及英雄单位本身回血都需要同步。毫无疑问,双方英雄单位的血量都是保存在服务端。当一方的英雄全部死亡的时候,就可以判定胜负结果了。血量同步是整个设计中唯一需要加锁同步的,不然就有可能出现双方最后一刀刚好把对方打死了,这时如果不加锁,就有两个赢家了。

这里抛个问题,技能伤害包应该由攻击方还是防守方发送?

答案当然是以攻击方的屏幕为准了,试想一下,假设因为网络问题或者防守方故意把游戏退到后台,以防守方为准的话,技能包不就丢失了!

四、buff同步

对于一个魔法类游戏来说,一场战斗会触发各种各样的buff效果,例如属性buff,状态buff,伤害buff。关键的是,由于大部分buff都会影响属性,进而影响伤害,所以不得不放在服务端运行。因此buff同步是全部同步类型中最难的部分,基本是把客户端的代码用服务端语言翻译一遍。由于buff复杂,因此不在两周的工作内容之内。

通过简单的消息转发,把以上几种类型的同步实现了,就可以放心地交货了。

两周后,经理在自己的手机上跟另一同事撸了一局,这时,无关比赛结果。看到经理露出了一丝微笑,我知道我可以安心下班鸟。(^-^)

都说pvp同步是一个大工程,两周做出的东西只能说一个骨架,接下来还需要考虑深层方面的诸多问题。

关于强同步与弱同步

战斗同步从指令释放是否需要服务端的同意为准则,可分成强同步和弱同步。强同步是指客户端发出的指令必须由服务端验证通过才可以释放。比如,客户端发出的放技能指令,需要服务端验证能不能放,有没有被控制等等,验证通过才告诉客户端可以释放了。而弱同步就是,不管服务端有没有同意,反正我本地判定可以放技能就放技能,可以走动就走动。

强同步设计起来比较简单,但在网络延迟的情况下,玩家会埋怨技能老是放不出来,或者老是在原地跑步。选择哪种方式,需要跟策划说明商量。

关于位置网络延迟

手游的网络环境不像端游那么稳定,特别是在Wifi的环境下进行游戏。比如你在玩游戏的时候,突然面前来了一个胖子,或者上厕所关了一下门,网络就会突然断了。因此,客户端发出的一个指定,可能服务端收到的时候已经过去一段时间了,再转发到另外的客户端又需要另外一段时间。同步位置的指令参数应该包括目标位置,移动的方向,以及到达目标的时刻,这样在玩家A的位置同步给玩家B的时候,我们可以根据数据包到达B的时刻t1与理论到达目标需要的时刻t2。若t1=t2,说明数据包已经延迟了,比较简单的方式可以直接让玩家A的镜像直接拉扯到目标点。

关于客户端对时

如何保证对战的双方的逻辑时间一样呢?我们只要保证双方都以服务器的逻辑时间为准就好了。这里不是要求将两边客户端的系统时间调成跟服务端一样,只是逻辑上一致即可。方法可以是这样的,在比赛开始的时间,客户端发送一个对时请求到服务端,记下此时客户端的时间t1,服务端收到指令后返回当前的服务端时间ts,客户端在t2时刻收到服务端的响应包。我们假定数据包上行下行所需时间是一致的,那么在客户端收到包的时候,服务端时刻为 ts' = ts + 1/2*(t2-t1)。那么客户端与服务端的时间差delay=ts'-t2。以后客户端发包的时候就可以加个时间戳delay+t(now),代表客户端相对于服务端的逻辑时间,服务端与对方客户端 可以直接根据这个时间戳判断数据包是否延迟了。这里有个问题,如果服务端收到的时间戳比服务端当前的时间还大,那么就说明当初对时的时间网络不好,这时,重新发个指令让客户端再对一下时就好了。

关于伤害验证

对于客户端传上来的伤害,服务端不能百分之百信任,所以服务端也需要按照客户端的逻辑把伤害计算一遍,如果两者误差在容许范围则通过,否则以服务端计算结果为准。这就要求服务端需要有玩家属性相关的数据,以及buff状态等等。

关于服务端buff系统

伤害在服务端计算直接导致服务端需要运行buff系统,因为buff是有时效性,buff会影响属性,会影响玩家状态(例如免疫伤害的buff效果直接将伤害无效化)。由于每个单位都可能挂有buff,而服务端需要同时支持数以千计的玩家在对战,因此验证buff的定时器不宜跑得太频繁。

关于游戏初期无人匹配对手的问题

游戏上线初期没什么人气,或者冷门时间端上去玩,都有可能出现玩家匹配不到结果。这时,比较简单的处理方式是当玩家匹配不到真人的时间,直接服务端返回一些机器人数据就好了,那么这时就是伪pvp了。或者找一些比较有空的策划啊,测试啊,在上班时间上线陪练也可以。游戏也有点像魔法,有时需要甩一些障眼法,哈哈

手游实时对战初步解决方案相关推荐

  1. 手游实时语音,你所不知道的那些事

    随着手机性能的提高,手游开始向复杂化发展.不再是以消消乐这种简单的小游戏为主,RPG.实时对战类游戏开始变火.这种游戏,由于有玩家间的交互,有团队作战.配合,保证玩家能够进行实时语音通话,成为极大的需 ...

  2. 动作手游实时PVP帧同步方案(客户端)

    1.概述 1.1.基于UDP的帧同步方案 在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下: 高一致性.如果每一帧的输入都同步 ...

  3. 手游引擎之战再现新挑战者,OGEngine来了

    GameRes报道 / 在刚刚召开的移动游戏大会上,Unity公司和触控科技分别发布了Unity的2D引擎及Cocos的3D引擎,一时激起了圈内的对原本不太受关注的游戏引擎的强烈兴趣. 本来,在游戏产 ...

  4. 手游爆发“平台战”启幕

    iSmart-艾思 www.smartmobi.com.cn 来源:第一财经日报 行业调研数据印证了手游市场的非凡热度. 近日,中国版协游戏工委联合IDC发布的2012年1~6月<中国游戏产业报 ...

  5. 动作手游实时PVP技术揭密(服务器篇)

    前言 我们的游戏是一款以忍者格斗为题材的ACT游戏,其主打的玩法是PVE推图及PVP 竞技.在剧情模式中,高度还原剧情再次使不少玩家泪目.而竞技场的乐趣,伴随着赛季和各种赛事相继而来,也深受玩家喜爱, ...

  6. 【Meetup预告】OpenMLDB+37手游:一键查收实时特征计算场景案例及进阶使用攻略

    2022年9月24日(周六)上午 10:00-12:00,开源机器学习数据库 OpenMLDB 第六期 Meetup 将通过线上直播的形式展开. 活动背景 提供生产级实时数据及特征开发全栈解决方案的开 ...

  7. MMORPG手游AOI解决方案

    接下来打算做一个国战类的MMO手游,国战类手游首相要解决的就是多人同屏AOI问题.稍微看了一下主流的解决方案,做个简单的记录. 目前最常见的是有两种解决方案,九宫格和十字链表. 一 九宫格 主要思路是 ...

  8. 梦幻西游手游登录显示服务器错误,梦幻西游手游无法登陆怎么解决 无法登陆原因及解决方案一览_3DM手游...

    在最近一段时间里,很多玩家在梦幻西游中突然发现无法登陆游戏,为什么会无法登陆游戏?这个问题有办法解决吗?下面小编就为大家介绍梦幻西游无法登陆的原因及解决办法,出现这种问题的小伙伴们快来看看吧. 梦幻西 ...

  9. 大话西游显示无法连接服务器,大话西游手游无法登陆怎么解决 无法登陆原因及解决方案一览_3DM手游...

    在最近一段时间里,很多玩家在大话西游中突然发现无法登陆游戏,为什么会无法登陆游戏?这个问题有办法解决吗?下面小编就为大家介绍大话西游无法登陆的原因及解决办法,出现这种问题的小伙伴们快来看看吧. 大话西 ...

最新文章

  1. 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式
  2. 转】Spark DataFrame小试牛刀
  3. substringToIndex substringFromIndex
  4. 支付宝即时到账接口开发 - DEMO讲解
  5. firewall mysql端口_Centos7 firewall开放3306端口
  6. 95-240-050-原理-State-RocksDBStateBackend
  7. 1012. 数字分类 (20)-PAT乙级真题
  8. 你的努力,是否符合你的预期?
  9. 20135202闫佳歆——信息安全系统设计基础第六周学习总结
  10. 说一说我电脑上的那些必备软件
  11. html怎么做彩虹渐变,PS彩虹怎么做?|渐变工具制作彩虹方法教程
  12. Pandas DataFrame为什么弃用.ix【个人看法】
  13. Tracking By Detecting的多目标跟踪
  14. TIOBE 2015年6月编程语言排行榜
  15. 最新速卖通提前放款服务解读,帮助商家减轻资金压力!
  16. cad lisp 两侧偏移并删除_cad lisp 两侧偏移并删除_知道这些技巧-轻松攻克CAD所有困难...
  17. linux系统管理与服务器配置高志君_Linux系统管理与服务器配置
  18. 微服务 中台架构演进
  19. 在家做什么兼职最靠谱?不去上班做什么好?
  20. 《走出自己的围城-2017年终总结》

热门文章

  1. 前端基础-CSS-引入字体
  2. 臀中肌----为你的膝盖保驾护航,臀中肌的作用以及最佳训练动作
  3. 淘宝店铺关联销售方法讲解
  4. 如何网上查询国管住房公积金
  5. 2017北京国庆刷题Day5 afternoon
  6. jQuery色轮插件 Farbtastic v1.3
  7. Jquery在表格中搜索关键字
  8. 手机上的照片批量传到电脑里
  9. 一文看懂新冠肺炎国际疫情现状局势
  10. 【前端基础】表单标签/提交