《穿越火线:枪战王者》手游客户端技术方案: 实时同步与手感优化
一、项目背景
CF手游的团队有着相当丰富的FPS游戏制作经验,但是移动端开发经验相对匮乏。团队面对的挑战很大,我们需要在手机端完美还原CF十多个游戏模式,上百把枪械手感。
虽然我们有实时对战FPS游戏开发经验,但是手游网络质量很差,我们需要保证在高Ping值,高丢包率的弱网络环境下流畅同步,并且避免外挂的出现。CF端游用户量很大,手游也会是一个高在线的游戏。对于后台我们希望能大幅度地提高负载,节省成本。
二、解决方案
1. 移动端实时同步技术
1.1 CF手游的C/S架构
CF手游是竞技向的手游,为了杜绝外挂,弱网络下有良好表现,注重游戏的时效性,最终选择基于 C/S架构使用可靠UDP作为网络层的同步方案:
图CF手游网络架构
引擎层:Unity的物理引擎是Physx。为了保证两边物理算法一致,我们搭建了基于Physx的物理服务器,并对其作出优化,同时集成了Recast Navigation等高性能引擎组件为服务器提供基础功能。
数据层:基于我们的关卡工具导出碰撞模型和关卡数据提供给服务器,保证数据一致。
游戏逻辑层:客户端使用C#编写,服务器为了高性能使用C++,保证核心运算一致。 客户端和服务器都会维护一致的逻辑实体,两边都做移动计算,服务器会在同样的位置进行命中伤害计算,并且通知客户端做表现。服务器永远是权威,客户端是哑终端,借此达到高强度的反外挂。
整体C/S架构基于我们实现的UDP网络层进行快速传输。
1.2 高性能的Dedicated Server与服务器负载优化
图CF手游服务器物理世界还原
CFM的即时对战服务端(DS)是依赖虚幻3引擎开发过程中积累的经验,完全为手游重写的。DS基于PhysX和Recast开源组件开发,对程序性能有良好的控制。在腾讯标准M1机型配置下,单机综合承载可以达到8000人。DS反外挂强度接近端游,单机性能比同类端游提高7-8倍。
1.3 高时效的UDP网络层
游戏对网络有实时性要求高,带宽要求小的特点。TCP虽然提供了可靠传输,但是内置的复杂拥塞控制算法并不是专为实时性优化的,也没有提供较好的方法让业务定制化。CF手游实现了自定义的RUDP协议方案,使用UDP保证协议实时性,同时通过自定义重传策略兼顾可靠性,取得了很好效果,主要技术要点包括:
数据传输分类
CF手游中并非所有数据都要求可靠,按游戏逻辑需要,只有不到50%的协议有可靠性需求,RUDP中只对这部分协议提供可靠性保证。而非可靠包则保证尽快到达,以满足游戏的实时性需求。对玩家移动状态等信息,由业务层定时冗余重传。
图CF手游网络数据传输分类
客户端与服务器的交互时序如下:
图CF手游网络数据交互时序
快速发送
发送方不维护发送窗口,不等待前面包是否ack,有数据需要发送时立即发送。
快速重传
CF手游使用比TCP更高精度,响应速度更快的重传策略以保证实时性。
表RUDP快速重传策略
带宽优化
主要思路是有损服务和降低不必要开销。CFM持续进行了多轮流量优化,包括:
MTU设计为500+字节,应用逻辑保证数据包大小不超过MTU,避免拆包。
减小包头,8字节。
小包合并。同一帧发往同一个目标的多个小数据包合并为大包,减少包数量。
降低服务端帧率和位置精度,但不影响玩家体验。
1.4 弱网络移动同步方案
PVP实时玩家同步
CFM采用C/S架构,服务器上会执行完整的游戏逻辑。在移动同步上,玩家的位置也是以服务器的位置为准,客户端1P视角和3P视角分别进行同步和模拟。
图CF手游玩家实时同步方案
如上图所示,客户端1P根据玩家的输入调整移动方向和速度,并把相关信息上报到服务器。服务器对上报的信息进行合法性检验之后更新玩家的移动状态,并在每个逻辑帧下发移动信息到所有客户端。客户端在收到服务器下发的移动信息,使用适当的同步算法对玩家的移动进行模拟,达到实时流畅的同步效果。其技术要点如下:
客户端1P即时预表现,避免网络延迟带来的操作手感迟滞的问题。
客户端在接受玩家输入后,会即时更新本地的移动状态,并上报服务器。在收到服务器回包之前,客户端1P就会按照新的状态进行移动,保证玩家的操作在第一时间得到响应。客户端与服务器物理世界的一致性则保证了客户端1P预表现的结果和服务器的移动结果是一致的。
客户端3P进行延迟补偿和预测同步,消除网络因素引入的位置误差。
在3P的同步模拟上,CFM参考了DR算法(Dead Reckoning)和影子跟随算法等方案,并针对移动弱网络的特点,加入了延迟补偿和预测同步的特性,解决了在网络抖动的情况下同步位置差距大和移动过程卡顿等关键问题。客户端收到服务器的移动信息后,会对服务器的移动路点进行过滤和合并,然后构造出3P同步模拟的移动路径。同时,客户端会根据当前与服务器的位置差距以及当前的网络延迟对模拟移动时的运动速度进行补偿,从而保证客户端3P经过SimulateTime时间的模拟移动后与服务器的位置达到一致。
另外,在移动弱网环境下,网络抖动会导致游戏过程中网络瞬时延迟变大,客户端在3P同步模拟过程中可能出现服务器下发的移动信息丢失或者延迟到达的问题。在这种情况下,3P模拟的移动过程就会被打断,出现走走停停的卡顿现象。为此,CFM在同步模拟的过程中加入了预测同步,在没有收到服务器信息的情况下,会根据玩家之前的移动状态继续预测移动,预测时间为2倍的网络延迟。在预测移动过程中,如果收到来自服务器的移动信息,则会自动恢复为正常的同步模拟过程,从而保证了3P同步模拟过程中移动的流畅性和连续性。
服务器延时、丢包补偿
丢包时,服务端可能由于移动路径不连贯而卡在拐角处,需要有补偿机制。因为传输延迟,从客户端向服务器发起移动请求,到服务器开始模拟有时间差。CF手游服务端需要回溯到移动包的历史时间,再追到当前时间。这样允许最多减少100-200ms内的C/S不同步现象。另外当客户端移动路径部分丢失后,服务端根据历史数据,尝试推算可能的移动路径。通过尝试绕路策略避开障碍,在较小范围内近似模拟客户端路径。
应用平滑插值和物理力学。
在移动弱网环境出现抖动时,服务器的移动信息可能会延迟到达或者扎堆到达,导致客户端3P同步模拟过程中速度陡变,移动过程忽快忽慢等问题。因此,CFM对同步模拟过程中速度的变化进行了平滑插值,保证速度的变化符合玩家对现实世界变速的认知,提高游戏的真实感。另外,在进行大角度变向过程中,根据物理力学规律,玩家角色应该遵循先减速再逆向加速的物理过程。CFM在同步模拟过程中对玩家的此类行为进行了分析判定,并实现了相应的物理模型,避免玩家在变向移动时速度过快难以命中的问题,增强了游戏体验。
PVE大规模怪物同步
CFM的多人PVE模式以末日逃生,僵尸围城为设定,为了更好地表现尸潮围堵的感觉,提高玩家闯关过程中的爽快感,必须支持大规模的怪物行为同步。面对大量怪物带来的流量消耗及客户端性能压力,CFM针对PVE怪物行为的特点重新设计了低误差,低流量消耗,支持复杂行为的同步方案。
图CFM指令式怪物AI同步方案
支持上百AI单位的实时同步,核心问题:
服务器伤害逻辑与客户端行为表现一致性;
怪物群体行为与移动同步;
大规模怪物同步流量控制;
AI命令按需发送,降低流量消耗。
在CFM的多人PVE模式中,怪物的移动信息只会在怪物移动路径变更时进行同步,而不是传统方案中的每帧同步。怪物路径更新的频率约为1~2秒/次,其同步流量消耗只有传统方案的1/8左右。
通用怪物行为建模,对复杂怪物行为进行抽象。
CFM中怪物种类多样,怪物行为特别是BOSS技能流程复杂,包括各种连续技和组合技。CFM怪物同步方案中对怪物的行为进行了抽象,把怪物的行为规范到统一的流程中,通过对服务器下发的技能指令进行解释,生成客户端技能状态机,驱动怪物的复杂行为表现。
PVE大量怪物同步:群体行为
难点:
Ø 常规寻路导致怪物位置重叠;
Ø 纯客户端方案导致位置差异大;
解决:
Ø 服务器计算怪物群体力,构造移动路径;
Ø 客户端根据下发路径进行移动模拟;
效果:
Ø 保证服务器与客户端路径一致;
Ø 路径合包下发,节省流量;
Ø 避免客户端寻路与碰撞计算,提高性能;
2. 移动FPS游戏手感
2.1移动端操作手感
FPS竞技类游戏,对玩家操作的反应和准确性要求极高,如何在移动端实现良好的操作手感是个很大的挑战。我们从移动、瞄准和射击三个维度进行了深度探索和优化,不断尝试了几十种手感方案,上百套参数调整,最终得到了目前的操作手感解决方案。
适配多样屏幕的操作数学模型
我们获取玩家的触屏输入Touch,通过计算Touch的位置和DeltaPosition,转换为角色的移动加速度和视角转向角度等。
由于屏幕的密度和手机分辨率各不一样,相同的滑屏物理距离会得到不一样的DeltaPos,因此CFM在操作模型计算中加入了移动设备的dpi和分辨率因子来解决一致性问题。
抖动手感数学模型
抖动的主要因素有两个:一是触摸的不精确性,另一个是游戏帧率的抖动。触摸的不精确性,是由于我们手指与屏幕的接触是一块区域,但程序中获取的却是一个像素点,并且各个系统的实现也各不一致。
3D Touch
在苹果推出的新一代多点触控技术3D Touch后,我们立刻进行了相关的技术预研,最终实现了一种能完美解决操作体验的手感方案,也成为了首款支持3D Touch的FPS手游,并申请技术专利。我们在跟随开火的基础上,加入了按压力度来触发开火(即3D Touch)。在iOS上,我们通过Hook UIKit的事件分发,从而把按压力度转发到C#层来实现。
图CF手游3D Touch
2.2枪械射击手感
作为经典第一人称射击游戏CF在移动平台上的延续,CFM力求为玩家还原最真实的枪械手感。CFM结合移动客户端上玩家的操作方式进行优化,创新性的设计自身的枪械弹道数学模型,此模型成为射击游戏的标杆:
T字弹道模型
枪械射击时,子弹射出的最终方向主要由三个因素决定,一是枪射当前瞄准的方向,即玩家希望射击的位置;二是枪械后座力引起的枪口上抬和左右偏向,形成T字形的主弹道;三是枪管震动和环境因素对子弹弹道形成的轻微扰动,即子弹弹道的散发。
图CF手游枪械弹道模型
枪械后座力模型
枪械每次射出的子弹的反作用力都会导致枪口上抬和左右偏向,上抬和摇晃的幅度与枪械当前连发数成正比,枪口随着连发数的增加逐步上抬,到达最大上抬幅度后转为随机方向的左右摆动。
在枪械停止射击后,游戏模拟枪口位置在玩家控制下从上抬位置恢复到初始位置,恢复的过程使用弹簧模型,遵循胡克定律。
子弹弹道散发模型
现实中子弹射出的时候受各种环境因素影响,会出现小幅度的随机偏向,子弹的最终射出方向即是在后座力计算后的前向方向叠加上散发的偏差,弹道散发的幅度和方向符合高斯正态分布。因此CFM在实现枪械散发模型时也使用高斯随机数实现。
创新辅助瞄准机制
CFM在射击上创新性地设计了一套辅助瞄准机制,帮助玩家自动瞄准静止和低速运动的目标,降低新手玩家的操作门槛,提高新手玩家的乐趣。同时,辅助瞄准在面对快速移动和转向目标时将失去效用,以此保证高手玩家的技术优势,提高玩家对技术提升的追求。