广告位API接口通信错误,查看德得广告获取帮助

电竞之家_品味电竞生活移动版

主页 > 守望先锋 >

浅谈《守望先锋》中的 ECS 构架(7)

一旦度过了网络不稳定期,服务器会通知客户端已经正常了,这个时候客户端知道自己压缩时间导致的领先时长,对应的膨胀放慢时间(降低向服务器发送操作的频率)让状态回到原点即可。

btw,守望先锋是基于UDP通讯的,从演讲介绍看,对于UDP可能丢包的这个问题,他们处理的简单粗暴:客户端每次都将没有经过服务器确认的包打包在一起发送。由于每个逻辑帧的操作很少,打包在一起也不会超过MTU限制。

ECS在这个过程中真正发生威力的地方是在预测错误后纠正错误的阶段。一旦需要纠正过去发生的错误,就需要回滚、重新执行指令。移动、射击这些都属于常规的设定,比较容易做回滚重新执行;技能本身是基于暴雪开发的State的,通过它来达到同样的效果。ECS的威力在于,把这些元素用Component分离了,可以单独处理。

比如说射击命中判定,就是一个单独的系统,它基于被判定对象都有一个叫做ModifyHealthQueue的组件。这个组件里记录的是Entity身上收到的所有伤害和治疗效果。这个组件可以用于Entity的筛选器,没有这个组件的对象不会受到伤害,也就不需要参与命中判定。真正影响命中判定的是MovementState组件,它也参与了命中判定这个系统的筛选,并真正参与了运算。命中判定在查询了敌对关系后从MovementState中获取应该比对的对象的位置,来预测它是否被命中(可能需要播放对应的动画)。但是伤害计算,也就是ModifyHealthQueue里的数据是只能在服务器填写并推送给客户端的。

MovementState会因为需要纠正错误预测而被回退,同时还有一些非MovementState的状态也会回退,比如门的状态、平台的状态等等。这个回退是Utility函数的行为,它可能会影响受击的表现,而受伤则是另一种固定行为(服务器确定的推送)的后果。他们发生在Entity的不同组件切片上,就可以正交分离。

(责任编辑:波少)
广告位API接口通信错误,查看德得广告获取帮助