网络游戏实时动作同步方案手记

来源:互联网 发布:淘宝赔货怎么流程图 编辑:程序博客网 时间:2024/06/05 15:47
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

网络游戏实时动作同步方案手记

 

 MMORPG不同,实时动作型网络游戏 追求操作的响应要求极高(<150ms)
动作型网络游戏的制作人希望做到单机游戏的体验,网络游戏的服务。
  
 
网络指令在多客户端间的同步算法,从原理上来说,围绕两种特性的取舍而定:
  * 
牺牲局部实时性:某程度的互等待,保证各客户端间指令集在指定时间段一致。
  * 
牺牲局部一致性:容许客户端本机先行模拟,等待后续指令到达纠正。(DR)

 
网络的存在导致鱼与熊掌不可兼得,所以现在市面上的动作网络游戏都有
如下的妥协和折衷实现:
  * 
在客户端本机上算大量关键运算来保证手感
  * 
玩法上对直接进行的决定性互动的要求不高
  * 
接受时不时网络延迟导致等待的缺点来维持复杂精确的玩法
  * 
策划维持可玩性的底线下对一些一致性的要求减低
  
 
实时性需求非常高的网络游戏,舍是一种关键艺术。
  FPS
,赛车,RTS,泡泡堂/QQ堂,模拟器联网等类型的网络游戏在一定程度上
都有以上的一个或多个取舍抉择。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

网络游戏在同步过程中发生状态(比如动画、死亡)不同步的情况下,客户端应如何纠正?

一个个状态的追逐过去,可以以服务端为准,也可以以客户端为准。
这句话下面有很多细节:

1.客户端表现层快速一个状态一个状态的追过去,不能跳过状态,比如角色跳动了很多下以后,你得一次次的追赶过去,不能直接从原始状态插值过去,否则人可能看起来一直在天上飞。
2.
具体判定可以用服务端或者客户端,看你需要,服务端判断会更准确权威,客户端判断容易作弊但手感更好。
3.
客户端判断时直接击中就击中了,不管远端的客户真实位置在哪里,在cs里面看起来这个效果就是穿墙,我以为我已经跑到墙后了,但是还着了一枪,不是因为穿墙而是因为对方那里,我刚跑到中间,没到墙后。
4.
如果客户端表现层的状态离真实状态差太远了,就直接把它一次性改过来,不必插值和追逐了,客户端看起来就是网络卡两秒后,屏幕全变了。
5.
有上面这几点做保障,基本上逻辑是严密的,你自己多实际测试一下,即使有第四条兜底,但它也不常发生,大部分时候不会出现这么离谱的偏差,即时出现了,屏幕全变也是可以接受的。



问答二:

作者:赵洪松
链接:https://www.zhihu.com/question/39633791/answer/82547706
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先,逻辑和渲染分离,服务器和客户端分离(废话)。

逻辑和渲染分离其实很简单,就是逻辑最好不要和动画相关,而且逻辑最好要能支持快放,逻辑帧尽可能的少(客户端渲染很可能是60帧,而逻辑判定往往要不了这么精确,再说,如果客户端机能比较差,玩家觉得卡顿的情况下,逻辑也应该是正确的)等等。

服务器客户端的逻辑层之间同步(不牵扯动画,会简单一些),然后客户端的逻辑层驱动渲染层渲染。

客户端需要快速的响应玩家操作(本地简单的逻辑判断后,就走渲染流程吧,可以有一些吟唱之类的设定来缓解设计缺陷),服务器判断攻击结算和消耗(掉落这些更应该服务器判断)。
小的延迟,如果招数伤害不复杂(大多数游戏还是指定角色攻击,而且在出招的一瞬间就必命中的,少量飞行道具,或者慢或者命中范围广或者AOE等等),其实ping100以内(甚至几百)都是能接受的,在策划的设计上就应该允许网络延迟导致微小不同步时,玩家在体验上能接受服务器判定(策划的设计很重要,很多技能连暴雪都不做不是他们想不到,而真的是不好做......

除了战斗外,其实行走的同步会更麻烦,不管是鼠标还是键盘,都不好做到绝对同步,因为跑动的操作才是最频繁的,这个操作让玩家明显觉得卡顿或者跳,就不要玩了(至少我们的游戏没做到,2台机器上的跑步其实是有细小误差的),这里就只能客户端想办法来配合服务器了,必要的时候需要有一些加速跑位。
这个有影响么?看精度要求了。
所以就还是上面提到的,如果策划设计上就允许这类不同步,或者能回避掉就好了。

然后,还需要注意的就是,肯定是需要同步时间戳,至少毫秒级(或者逻辑帧级),一旦发现网络越来越不好,达到一个阙值,就应该进入卡顿模式(自己可以动,但别人都卡主,技能什么也都不能放),这时就算有瞬间通畅,最好也维持这个状态,要显示的告诉玩家:这是你自己的网络卡了。
如果一定时间内,能恢复正常,最好保证逻辑彻底同步上再重刷渲染层,一段时间内还恢复不了,就提示玩家吧。

以前看过一些局域网游戏的同步算法,FPS之类的,确实比ARPG要复杂很多,后来一直对CF这些不感冒,手游上的玩过几款,很明显也是服务器判定的,网络不好的时候,你会明显的知道自己网络不好了,然后你打中别人,但服务器判定你没打中,你也就认了,所以,网络不好的时候,一定要想办法提醒玩家,你网络不好了,注意啊。

印象中还有个赛车游戏,游戏过程中,断网,然后以第一名姿态跑完全程(其他玩家的车也都在跑,好像也有一些动作吧,但能影响到我的操作估计没有)都没提示我断网,最后结算的时候卡主,连上再看才发现成绩是最后一名。

所以说,用户感受好了,管你是忽悠他的还是真正解决一个世界大难题,其实都不重要了。

如何看别人的同步处理呢?其实很简单,断路由,降带宽啊,各种方法,测试别人家的游戏不是很简单么,看看极限情况的处理,往往就能大概想明白思路了,有了思路,剩下的就好办了。
原创粉丝点击