热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

游戏中帧同步与状态同步

什么是游戏中的帧同步游戏中的帧同步是一种客户端与服务器的同步方式,是为了实现高实时性,高同步性的应用而产生的。例如大家喜欢玩的王者荣耀,如

什么是游戏中的帧同步

 

游戏中的帧同步是一种客户端与服务器的同步方式,是为了实现高实时性,高同步性的应用而产生的。例如大家喜欢玩的王者荣耀,如果玩家A对玩家B发出了攻击而玩家B过了很久才发现,那么玩家B很可能就来不及做出防御,那这个游戏就没法玩,所以所有玩家的指令一定是要及时地同步到所有玩家的终端上的,而且大家收到的信息一定要是一致的,不然没法玩。

 

-实时性

 

网络存在延迟,客户端发出指令到服务器需要时间,服务器发送指令到其他客户端也需要时间,为了做到让玩家感觉不出来延迟,这个发送消息的周期一定要短,例如我50ms就同步一次信息,加上网络延迟100ms,150ms的延迟,玩家是反应不过来的,这个延迟对于玩家来说是越小越小,但是对于运营成本,同步消息频率越大,对于性能要求越高,成本也就越高,所以是要做一个权衡。而且为了能够减小服务器的压力,也为了能够更快地转发信息,游戏的逻辑一般会放到客户端去执行,这样更快。

 

-同步性

 

客户端需要将指令同步后然后在固定的帧间隔内进行逻辑计算,而不是将逻辑计算好了再发送到其他客户端,原因是在某一帧内,玩家如果在不知道其他用户的操作的情况下进行逻辑计算的话,会造成计算结果的不一致,比如说一帧内玩家A攻击了B导致B死亡而这一帧内B也攻击了A导致A死亡,那么两个客户端都认为对方死了,实际上通过指令同步后进行计算,只会有一个死。那就是最先发起攻击的那个人。

 

如果使用同步指令后再计算的模式,那么需要保证的是每个客户端收到相同指令都会运行出唯一的结果,为了保证这一点,所有客户端都应该有相同的随机种子,也就是说如果有需要随机的地方,那么每个客户端都应该随机出同一个结果,比如玩家A掷骰子,那么每个客户端那里玩家A都应该掷出相同的数字。

 

指令是不能丢失的,丢失后就会有客户端计算的结果不一致了,所以网络传输必须使用有数据可靠性保证的传输方式,例如tcp,例如kcp。

 

为了应对玩家掉线的情况,服务器应该保存一场游戏中的指令,在玩家断线重连后发送到玩家终端。

 

帧同步案例参考:《Unity3D RTS游戏中帧同步实现》

 

状态同步:

 

什么是状态同步:同步的是游戏中的各种状态。一般的流程是客户端上传操作到服务器,服务器收到后计算游戏行为的结果,然后以广播的方式下发游戏中各种状态,客户端收到状态后再根据状态显示内容。状态同步最广泛的应用应该是在回合制游戏中。

 

状态同步其实是一种不严谨的同步。它的思想中,不同玩家屏幕上的表现的一致性并不是重要指标, 只要每次操作的结果相同即可。所以状态同步对网络延迟的要求并不高。像玩RPG游戏,200-300ms的延迟也可以接受。 但是在RTS游戏中,50ms的延迟也会很受伤。

 

举个移动的例子,在状态同步中, 客户端甲上操作要求从A点移动到B点,但在客户端乙上, 甲对象从A移动到C,然后从C点移动到了B。这是因为, 客户端乙收到A的移动状态时, 已经经过了一个延迟。这个过程中,需要客户端乙本地做一些平滑的处理,最终达到移动到B点的结果。

 

所以国产RPG游戏中,动画的特效一般做的比较绚丽(大), 攻击的时候给人感觉是击中了。放技能之前一般也有一个动画前摇,同时将攻击请求提交给服务器。等服务器结果返回时,动画也播放完毕了,之后就是统一的伤害效果和结算。

 

以上就是游戏中帧同步与状态同步的介绍,希望有助于大家去理解。


推荐阅读
  • 解决vCenter vSphere HA初始化失败的问题
    本文探讨了在集群中遇到的所有vSphere HA主机状态显示‘无法正确安装或配置vSphere HA代理’错误的情况,并详细介绍了排查与解决步骤,包括检查HA初始化错误及安装HA代理的常见故障排除方法。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • Redis安全防护深入解析
    本文详细探讨了如何通过指令安全、端口管理和SSL代理等措施有效保护Redis服务的安全性。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • CentOS 转向引发争议,联合创始人推出 Rocky Linux
    CentOS 转向 CentOS Stream 引发用户不满,其联合创始人 Gregory Kurtzer 推出新的社区项目 Rocky Linux,旨在延续 CentOS 的精神。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • VMware Horizon View 5.0桌面虚拟化部署实践与心得
    在近期的研究中,我花费了大约两天时间成功部署了桌面虚拟化环境,并在此过程中积累了一些宝贵的经验。本文将分享这些经验和部署细节,希望能对同样关注桌面虚拟化的同行有所帮助。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 本文探讨如何使用 PHP 进行字符串处理,特别是如何检测一个字符串是否存在于另一个字符串中,并确定其具体位置。通过实例代码展示,帮助读者掌握这一常用功能。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • 本文介绍了MySQL数据库的安全权限管理思想及其制度流程,涵盖从项目开发、数据库更新到日常运维等多个方面的详细流程控制,旨在通过严格的流程管理和权限控制,有效预防数据安全隐患。 ... [详细]
  • 本文详细介绍了在金蝶财务软件中设置和执行凭证连续打印的具体步骤,帮助用户高效完成会计凭证的批量打印工作。 ... [详细]
  • 在树莓派Ubuntu(ARM64)上安装Node.js
    本文详细介绍了如何在树莓派Ubuntu系统(ARM64架构)上安装Node.js,包括下载、解压、移动文件以及创建软链接等步骤。 ... [详细]
  • 在使用OSChina平台进行Git代码上传时遇到文件夹遗漏的问题,这可能导致项目构建失败或功能不完整。本文将探讨可能的原因及解决方案。 ... [详细]
author-avatar
菜123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有