MMO网络同步通常都是c/s架构的状态同步,通常战斗要同步的信息包括角色的基础状态信息,位置,朝向,姿态,运动速度等,以及战斗相关信息,角色本身的buff,debuff,当前的攻击动作/受击动作等。
通常来说出于反作弊的考虑,客户端不在本地做一些重要的战斗计算,通常是接收状态同步协议,根据收到的数据对场景中的角色执行状态同步,同时将主角的操作指令发送给服务器,由服务器收集所有玩家的指令进行计算,得出结果后将场景和角色本身的状态变化进行下发。 据本人的了解mmo服务器战斗逻辑帧率通常是5-20,客户端逻辑帧率通常是30或者60。
由于服务器本身的帧时间以及网络延迟影响,客户端不可能在发出操作指令后立即收到服务器回复(即使立刻收到回复,客户端也只能在下一个逻辑帧更新相关状态),因此客户端通常会对当前操作的角色行为进行预测,通常客户端在基于当前场景信息得出操作指令可以成功时会直接执行对应操作,比如移动,或者做出战斗动作。大部分技能通常会拆成三部分,技能前摇,技能实际释放,技能后摇,通常客户端会立即执行技能前摇动作,而技能实际释放则会在服务器返回本次战斗操作指令的确认协议时才会执行,如果服务器返回结果是指令失败,则取消后续技能动作。通常我们的技能前摇会根据一般的网络情况以及服务器的帧时间进行调整。比如如果大部分玩家的延迟是30ms以下,服务器帧率为10即逻辑帧时间为100ms,则技能前摇时间尽量设置在160以上,比如180或者200,这样可以尽量减少玩家在释放技能时的卡顿感。
客户端的移动预测和平滑处理,如果是像素级别的移动,通常会采用客户端本地对象跟随服务器对象位置进行插值的模式进行,转向,动作变化以及位置变化都可以通过这种方式进行平滑处理。如果直接设置本地对象的基础状态,不进行平滑处理,虽然这样本地对象与服务器的状态之间差异会比较小,但是可能表现会显得很生硬。
场景地图的加载。当前的mmo通常都是大世界地图的模式,场景通常采用切块流式加载的方式进行,在3d游戏中,通常除了大地图场景切块之外,在当前显示的几块地图中也会进行lod分级的处理。而如果玩家的视距较远,则远处的标志性环境物体,山,参天古树,标志性建筑等,也需要显示出来,通常山体等可能会是贴图或者干脆做进场景的天空盒子里,标志性建筑和参天古树等可能会根据方位显示一个低模,如果特别大树的比如艾尔登法环里的黄金树,其实在远处也是个贴图
参考文献
未完待续