《穿越火线:枪战王者》手游客户端技术方案: 实时同步与手感优化 转载

一、项目背景

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持续进行了多轮流量优化,包括:

1.MTU设计为500+字节,应用逻辑保证数据包大小不超过MTU,避免拆包。

2.减小包头,8字节。

3.小包合并。同一帧发往同一个目标的多个小数据包合并为大包,减少包数量。

4.降低服务端帧率和位置精度,但不影响玩家体验。

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在射击上创新性地设计了一套辅助瞄准机制,帮助玩家自动瞄准静止和低速运动的目标,降低新手玩家的操作门槛,提高新手玩家的乐趣。同时,辅助瞄准在面对快速移动和转向目标时将失去效用,以此保证高手玩家的技术优势,提高玩家对技术提升的追求。

《穿越火线:枪战王者》手游客户端技术方案: 实时同步与手感优化
https://blog.51cto.com/dasein58/4584455

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

需求目的: 手机机通过webView展示H5网页,在特殊场景下,需要使用相机拍照或者从相册获取照片,上传后台。 完整流程效果: 如下图 一、H5界面样例代码 使用html文件格式,文件直接打开就可以展示布局&#…

从源码学习单例模式

单例模式 单例模式是一种设计模式,常用于确保一个类只有一个实例,并提供一个全局访问点。这意味着无论在程序的哪个地方,只能创建一个该类的实例,而不会出现多个相同实例的情况。 在单例模式中,常用的实现方式包括懒汉…

【C语言】linux内核ipoib模块 - ipoib_send

一、中文注释 int ipoib_send(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev); // 获取IPoIB设备的私有数据struct ipoib_tx_buf *tx_req; // 发送请求结构体int hlen, rc; // 分别为头部长度…

安装 WSL 报错 Error code: Wsl/WININET_E_NAME_NOT_RESOLVED 问题解决

问题描述 在执行 wsl --install 安装Windows子系统Linux WSL (Windows Subsystem for Linux) 时报错: 无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址 Error…

如何在本地电脑部署HadSky论坛并发布至公网可远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置)2.4 公网访问测试 总结 前言 经过多年的基础…

2000-2022年上市公司全要素生产率测算数据合计(原始数据+计算代码+结果)(LP法+OLS法+GMM法+固定效应法)

2000-2022年上市公司全要素生产率测算数据合计(原始数据计算代码结果)(LP法OLS法GMM法固定效应法) 1、时间:2000-2022年 2、范围:上市公司 3、指标:证券代码、证券简称、统计截止日期、固定资…

怎么自学python,大概要多久?python多久上手?

无限时长~~~~技术不断在更新,你的自学不也需要一直进行吗? 但如果是问:自学多长时间可以入门?或者可以找到工作?那我可以告诉你答案。 从零基础开始自学Python,依照每个人理解能力的不同,大致…

免费的WP模板网站推荐

免费wordpress模板下载 高端大气上档次的免费wordpress主题,首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html wordpress免费企业主题 深蓝色经典实用的wordpress网站模板,用wordpress免费企业主题搭建网站。 http…

Linux进程【补充】

文章目录 进程概念task_struct 进程创建forkvfork写时拷贝 进程状态僵尸进程孤儿进程守护进程 进程地址空间是什么为什么怎么做 进程概念 进程是一个程序的执行实例或者是担当系统资源分配的实体。当一个程序运行时,被从硬盘加载到内存中,操作系统为每个…

python 线程笔记一 (概念+示例代码)

1. 线程的概念 线程,可简单理解为是程序执行的一条分支,也是程序执行流的最小单元。线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属于一个进程的其它…

第10届蓝桥杯Scratch图形化编程 选拔赛初级组编程题1:小猫走城堡

准备工作: 导入育最库中的“Castle 3 小猫从坐标点(-165,-93)出发向城堡走去。随着位置的移动,角色大小逐渐变小,最后在城堡前消失。注意1.角色大小在逐渐变化,运行结束再次点击绿旗,程序应还能再次扶行。2.角色应该是…

云原生之API网关Traefik

1. 前言 说到web服务的开源网关,我首先想到的是Nginx,最早使用的就是它,现在都还在使用它。系统上线了Docker Swarm集群之后,不继续使用Nginx直接做Docker服务的网关,是因为Nginx毕竟比Docker Swarm出现的早&#xff0…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

✅鉴权—cookie、session、token、jwt、单点登录

基于 HTTP 的前端鉴权背景cookie 为什么是最方便的存储方案,有哪些操作 cookie 的方式session 方案是如何实现的,存在哪些问题token 是如何实现的,如何进行编码和防篡改?jwt 是做什么的?refresh token 的实现和意义ses…

pythonJax小记(五):python: 使用Jax深度图像(正交投影和透视投影之间的转换)(持续更新,评论区可以补充)

python: 使用Jax深度图像(正交投影和透视投影之间的转换) 前言问题描述1. 透视投影2. 正交投影 直接上代码解释1. compute_projection_parameters 函数a. 参数解释b. 函数计算 2. ortho_to_persp 函数a. 计算投影参数:b. 生成像素坐标网格&am…

protobuf简单使用(二)

介绍 上一节中,我们介绍了protobuf,简单来说,它是一种消息数据格式,其作用类似于json,但是比json的使用效率要高。 除此以外,我们介绍了protobuf的简单使用,也就是如何可以像使用json一样&…

AI游戏初创公司“奇酷网络”,获得500万元天使投资

发布 | 大力财经 2024年新春伊始的2月25日,国内首家“AI游戏”应用公司“奇酷网络”正式对外宣布:以3,000万元人民币的估值,成功获得500万元人民币的融资;资金来源于一名百度高层和一位知名的天使投资人。 据悉,“奇…

进程 2月24日学习笔记

1.进程: 程序:存放在外存中的一段数据组成的文件 进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息(根据CPU占用率排序) PID:唯一识…

namecheap域名如何购买?通过支付宝(详细图文教程)

引言 在完成博客搭建的时候,我们可能需要一个好的域名,自己看起来才会舒服点,同时也可以通过google或者百度等方式搜索到自己博客。 经过实验发现,一个好的后缀名会增强google和百度的搜索seo,增加自己博客的流量。 …

平头哥IP核C906的JTAG调试器DIY教程(一)

背景 最近买了一块基于平头哥C906核,SOC为全志的D1s,的核心板,手工焊接在白嫖的底板上(此处感谢百问网老师的友情支持,手动狗头)。在焊接完成后,进行点亮跑程序的时候,发现没有优雅…