关于游戏帧同步问题的总结

概述

本文介绍了开发帧同步游戏中的一些经验。包括一些开发和测试过程的方法。以及包含在帧同步游戏中使用Unity的物理引擎的可行性分析及遇到的问题。

 

帧同步的原理简述

要保证各个客户端的游戏表现同步,主要是保证各个客户端的数据同步,因为表现是依赖于数据。以MVC架构为例,数据就相当于MVC架构中的M(Model)

以游戏结构来说,一般而言,架构如下

 

  1. 界面显示依赖于数据模型
  2. 界面如果需要更改数据,需要将操作同步到所有客户端,不能直接在本地修改。

输入设备如果需要更改数据,同样需要将操作同步到所有客户端。

帧同步游戏的特点

相对于状态同步,帧同步有以下几个特性。

  1. 优势

1.1       同步简单。只要同步框架做好,开发过程可以把游戏当作单机游戏来做,极大的减少同步工作量。

1.2       可以处理非常复杂的同步过程。如果一个操作导致一连串的连锁反应,一般状态同步处理过程非常困难。而帧同步只需要同步初始操作指令。例如类似王者荣耀的动作游戏。一个技能的逻辑非常的复杂,用状态同步就非常的困难了。

1.3       不需要服务端参与同步工作,免除了大量的服务端与客户端的同步协议与调试工作。

         2.劣势

2.1   帧同步同时连接的客户端数量有限制,因为同步消息需要广播给所有客户端。一般使用帧同步的游戏客户端不超过20个。

2.2     地图单位数量有限制(不适合开放世界大地图)。因为客户端需要模拟整个游戏,如果游戏世界的运算量太大,客户端会有较大的计算压力。而状态同步客户端只需要模拟部分可见区域。

2.3  即时性较低。玩家的操作需要等待数据包与服务器一个来回的时间。因此不适合做即时性要求非常高的游戏。例如FPS。玩家开火需要立即反馈,如果需要等待数据包返回,那玩家的延迟感受就很明显了。

 

开发注意事项

要保证各个客户端数据同步,开发过程需要主意几个地方:

  1. 初始化数据一致。保证初始数据一致,包括初始化顺序也需要一致。
  2. 遍历列表和字典的顺序需要一致。字典最好使用有序字典,以方便遍历。排序最好使用稳定排序,防止各个客户端排序列表不一致。
  3. 浮点数精度截断。浮点数运算在各种硬件上会有精度差异。一般截断浮点数保留4位可以防止精度问题。
  4. 本地玩家逻辑判定不能直接更改数据。一般而言游戏需要依据单位是否为本地玩家而做一些特殊的表现。例如:单位完成任务,如果是本地玩家需要一个界面提示。主意本地玩家判定内部不能修改数据,因为各个客户端的本地玩家是不同的。
  5. 随机数一致。初始化各个客户端随机数种子一致,保证各个客户端输出的随机数一致。
  6. 输入数据需要同步。本地玩家的操作需要用帧同步指令同步给所有客户端。输入设备包括硬件设备(鼠标键盘等),也包括界面操作的输入。例如虚拟摇杆。
  7. 配置表数据一致。

 

测试方法

帧同步游戏在开发过程中只需要主意几个点,不需要关心同步问题。但是难保开发过程主意到了所有问题。在交付游戏包的时候需要严格的测试。而找游戏的不同步问题也是比较麻烦的和耗时的,因为往往看到不同步的表象的时候,已经是蝴蝶轻微震动翅膀产生的飓风了。

这里列举一些测试方法:

  1. 日志记录关键位置数据。可以将这些日志输出为专门的同步日志文件。用来比对一致性。完全同步的情况,输出的日志应该完美一致。如果不一致,日志也可能提供一些线索。
  2. 检查以上列出的事项是否有遗漏。例如搜索排序算法,字典遍历等过程。
  3. 以上都不行的话,可以用一个比较耗时的方法:排除法。

检查没有任何操作(移动、使用技能等)的时候是否同步,如果同步,增加操作,直至出现不同步的操作。如果没有任何操作还是不同步,将游戏逻辑屏蔽掉一部分再测试。例如把游戏AI关闭再测试,直至出现同步的情况。

如果操作太多的情况,为了加快测试过程,可以将操作列举出来,然后用二分法,一次选择一半的操作进行测试,如果出现不同步,那造成不同步的操作可以限定为选择的这一半,再将这一半操作二分,迭代测试,找出具体是哪个操作导致的不一致。

物理同步

2017之后版本的unity官方文档中,Physics接口提供了新的API:

Physics.Simulate

Other Versions

Leave feedback

public static void Simulate(float step);

Parameters

step

The time to advance physics by.

Description

Simulate physics in the scene.

Call this to simulate physics manually when the automatic simulation is turned off. Simulation includes all the stages of collision detection, rigidbody and joints integration, and filing of the physics callbacks (contact, trigger and joints). Calling Physics.Simulate does not cause FixedUpdate to be called. MonoBehaviour.FixedUpdate will still be called at the rate defined by Time.fixedDeltaTime whether automatic simulation is on or off, and regardless of when you call Physics.Simulate.

Note that if you pass framerate-dependent step values (such as Time.deltaTime) to the physics engine, your simulation will be non-deterministic because of the unpredictable fluctuations in framerate that can arise.

To achieve deterministic physics results, you should pass a fixed step value to Physics.Simulate every time you call it. Usually, step should be a small positive number. Using step values greater than 0.03 is likely to produce inaccurate results.

 

 

这里提到,如果传入固定的step参数,Simulate将产生一个确定的输出。也就是说,物理引擎支持帧同步。

如果物理引擎支持帧同步,那将可以利用物理引擎极大的助力游戏开发。

这次借助开发Demo的机会,也探索了一下这方面的可行性以及遇到的坑。

一开始搭建项目框架的时候,一切似乎都没有问题。物理引擎确实能够产生确定的输出。随着地图单位的增加,出现性能瓶颈。这时候开始着手优化性能。观察unity的profiler发现,CharacterController.Move方法,非常的消耗性能。当时将Move方法改为SimpleMove,测试之后,出现了角色坐标不同步现象。SimpleMove方法,传递的参数是Vector3 speed而移动一个单位,速度参数是不够的,还需要时间参数( s = v*t )。而这个方法的时间参数取自哪里不得而知。这可能是造成不同步的根源。

接下来我将CharacterController组件替换为了Rigidbody组件,使用刚体来驱动角色位移。性能也得到了极大的改进(300个单位,CharacterController.Move耗时9毫秒,Rigidbody 2毫秒)。这个时候,更为诡异的事情出现了,测试结果偶尔同步,偶尔不同步,并且如果让单位之间可以穿透,不同步的现象极大的降低(本机测试基本上是不出现了)。但是多端一起测试的时候,不同步现象还是容易出现。后来通过日志发现,只要玩家使用弹道技能,弹道碰撞到单位之后,这个单位的坐标极大概率会不同步(通过使用上面提到的二分法找到的问题)。因此确定了问题:刚体间的碰撞会造成不同步。单位之间互相穿透,降低了单位碰撞的频率,因此不同步的几率降低了,但是单位依然会与建筑等阻挡碰撞,依然会有概率出现不同步现象。

目前的解决方案是将玩家单位的刚体组件还原为CharacterController,将AI角色的移动组件设为NavMeshAgent。场景中不使用任何刚体。仍然可以使用物理引擎的触发器,碰撞检测方法。虽然CharacterController有性能问题,但是玩家单位比较少可以忽略不计。

总的来说,帧同步项目使用Unity的物理引擎需要慎重。虽然某些物理引擎的功能会带来便利,但是不能使用刚体。

内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,深入阐述了该方法的数学原理及其在参数辨识中的收敛性与稳定性优势。通过构建最小化误差的目标函数,并结合数值积分技术,采用迭代方式逐步逼近系统的真实参数值,有效解决了非线性动态系统中因缺乏解析解而难以进行精确建模的问题。文中提供了完整的Matlab代码实现,涵盖模型定义、迭代求解、参数更新与结果可视化等关键环节,增强了方法的可操作性与工程实用性。研究通过典型非线性系统案例验证了法的有效性,展示了其在科学计与工程建模中的良好适应性与推广潜。; 适合人群:具备常微分方程理论、数值分析基础及Matlab编程能,从事系统建模、参数辨识、动学仿真等相关方向的研究生、科研人员和工程技术开发者。; 使用场景及目标:①解决实际工程中非线性微分方程模型的未知参数估计问题;②深入理解Picard迭代法在科学计中的实现机制与数值特性;③为学术论文复现、科研项目开发或课程设计提供可运行、易调试的技术方案与代码参考。; 阅读建议:建议读者结合文中的数学推导与Matlab代码逐行分析,重点关注迭代流程、目标函数构造与数值积分的耦合实现,通过修改模型结构或噪声条件进行扩展实验,以深化对法鲁棒性与适用边界的理解。配套资源可通过指定公众号和网盘链接获取,推荐同步学习以加速科研进程。
内容概要:本文详细介绍了一种基于多尺度集成极限学习机(Extreme Learning Machine, ELM)的回归方法,并提供了完整的Matlab代码实现。该方法通过构建多尺度特征表示与集成学习机制,有效提升了ELM在处理非线性、高维复杂数据时的预测精度与模型鲁棒性,特别适用于时间序列回归任务。文档不仅阐述了法的核心原理与技术流程,还系统展示了其在风电功率预测等工程场景中的应用潜。同时,文中附带了丰富的科研仿真案例集合,涵盖智能优化法、深度学习、信号处理、电系统调度等多个前沿方向,体现了多学科交叉融合的技术优势与实践价值。; 适合人群:具备一定Matlab编程能,从事科学研究或工程应用的研究生、科研人员及工程技术开发者,尤其适合专注于机器学习、智能法优化、新能源预测与电系统建模等相关领域的专业人员。; 使用场景及目标:①用于风电、光伏、负荷等时间序列数据的高精度回归预测任务;②为科研工作者提供可复现的多尺度集成ELM模型代码框架,支持快速法验证与二次开发;③满足实际工程项目中对高效建模、实时预测与智能决策的技术需求。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解多尺度特征构造与集成策略的设计思想,同时可参考文档中其他相关法案例进行横向比较与综合应用,以提升整体科研创新能
内容概要:本文详细介绍了一种基于Simulink的Ćuk转换器仿真方法,该转换器能够将输入的直流电压高效地转换为极性相反的输出直流电压,具备优异的升降压能与系统稳定性。文章深入剖析了Ćuk转换器的核心工作原理、电路拓扑结构(包含开关管、电感、电容、二极管等关键元件)及其在能量存储与传递过程中的动态行为。通过构建精确的Simulink仿真模型,验证了系统在不同输入条件下的稳态与暂态响应特性,充分展示了其输出电压反相、纹波小、效率高的优势,适用于对负压电源有严苛要求的应用场景。此外,文档还整合了大量基于Matlab/Simulink和Python的科研仿真资源,涵盖风电预测、微电网优化、GAN场景生成、电电子系统建模等多个前沿方向,凸显了其在现代电电子与系统仿真研究中的重要价值。; 适合人群:电气工程、自动化、电电子及相关专业的本科生、研究生、科研人员及具备电路理论基础和Simulink仿真经验的工程技术人员。; 使用场景及目标:①深入理解Ćuk转换器的工作机理及其在直流-直流变换中的独特优势;②利用Simulink平台开展电电子电路的建模、仿真与性能分析;③为需要稳定负压输出的电源系统设计提供理论依据和技术验证方案。; 阅读建议:建议结合Simulink软件动手实践,重点掌握电路拓扑搭建、关键参数配置及仿真结果解读技巧,同时可延伸学习文中提供的其他科研案例,以拓宽技术视野并提升综合仿真能
内容概要:本文提出并实现了一种基于角蜥蜴优化法(HLOA)优化BP神经网络的风电功率预测模型,旨在解决传统BP神经网络在处理高随机性、强波动性风电数据时存在的收敛速度慢、易陷入局部最优等问题。通过HLOA对BP神经网络的初始权重和阈值进行全局寻优,有效提升了模型的预测精度与稳定性。研究详细阐述了HLOA的搜索机制及其与BP网络的集成方法,并提供了完整的Matlab代码实现,便于复现与验证。实验结果表明,相较于传统BP、GWO-BP、PSO-BP等模型,HLOA-BP在均方根误差(RMSE)、平均绝对误差(MAE)等指标上表现更优,具备更强的泛化能和鲁棒性,适用于风电场短期功率预测的实际工程场景。; 适合人群:具备一定机器学习理论基础和电系统知识,熟悉Matlab编程的研究生、科研人员及能源领域的工程技术人员,尤其适合从事新能源发电预测、智能优化法开发与应用的相关研究人员。; 使用场景及目标:①应用于风电场功率预测系统,提升电网调度的可靠性与运行效率;②作为智能优化法与神经网络融合的典型范例,用于教学演示、科研复现与模型拓展;③为撰写高水平学术论文提供可验证的技术路线与实验支撑。; 阅读建议:建议读者结合所提供的Matlab代码逐模块分析法实现细节,重点理解HLOA的个体更新机制与BP网络参数的耦合方式,并可通过更换实际风电数据集或对比其他优化法(如WOA、SCA等)进一步开展消融实验与性能评估。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值