RTS 客户端-服务器网络

news2024/11/17 21:34:33

Stone Monarch 从一开始就支持多人游戏,但随着时间的推移,网络模型经历了多次迭代。我最初基于这篇著名的帝国时代文章实现了点对点锁步模型。

点对点锁定步骤有一些众所周知的问题。点对点方面使玩家很难相互连接,并增加了每个新玩家的网络负载。锁定步骤方面很容易出现棘手的错误,导致玩家之间的游戏状态不同步。我当前的架构引入了服务器,并且还放宽了锁步的一些确定性要求。它仍然使用“回合”的锁步概念来确保每个客户端运行相同的模拟,并且在没有收到所有玩家的命令的情况下不会继续进行。

客户端-服务器锁定步骤

锁步转弯示例

游戏分为一系列固定持续时间的“回合”。游戏开始时的第一步是确定 1 回合的长度。这是通过测量消息从每个客户端到服务器的往返时间来完成的。服务器选择最长的时间作为回合长度。在游戏过程中,可以根据观察到的网络性能调整回合长度。

每当玩家想要执行某个操作时,请求的操作就会立即发送到服务器。服务器聚合它收到的所有操作,直到到达下一个回合边界。此时,服务器向所有客户端发送轮次消息,其中包含未来 1 轮要执行的操作。当客户准备好执行下一个回合时,他们应该已经收到模拟回合所需的所有信息。

在上面的示例中,转弯长度已设置为 100ms。服务器在第 1 轮期间接收操作,并在第 2 轮开始时发送包含第 3 轮操作的轮次消息。该消息应及时到达客户端,以便客户端执行第 3 轮。

处理延误

客户端延迟

如果其中一个客户端在准备好执行该轮次时没有收到轮次消息,则它必须暂停模拟,直到收到来自服务器的轮次。一旦它收到回合,它就可以立即开始再次执行。此时客户端将稍微落后于服务器的模拟,因此更有可能及时接收轮流。然而,玩家的命令发出和执行之间的延迟将会增加。

服务器端延迟

为了防止客户端远远落后于服务器的模拟(并遭受高命令延迟),服务器可以尝试检测到这一点并暂停其自己的模拟。为此,客户端可以在发送到服务器的每个操作中包含当前游戏时间。然后服务器将该时间与自己模拟中的当前游戏时间进行比较。如果差异大于 1 圈的长度(或任何任意长度),服务器可以暂停以允许客户端赶上。如果任何其他客户端在模拟中进一步领先,这可能会导致它们也暂停,直到所有客户端彼此更加同步。

在我最初的实现中,我使每次暂停的长度等于 1 圈的长度,这似乎是合乎逻辑的,可以防止客户在模拟中向前或向后滑动。然而,当前的方法极大地减少了暂停发生时的持续时间。通常,玩家甚至不会注意到它们。现在可以允许慢速客户端稍微落后于其他客户端,理论上他们可能处于劣势,因为他们的操作将需要更长的时间来执行。然而,这可以被服务器限制,所以我总是可以调整它以找到合适的平衡。

调整转弯长度

如果服务器观察到太多的暂停,它可以通过在轮次消息中包含新的轮次长度来增加轮次长度。所有客户在开始执行新回合时都将应用此规则。这将同等地增加所有玩家的命令延迟。

相反,如果服务器在一段时间内没有观察到任何暂停,它可以减少回合长度,从而为所有玩家提供更低的命令延迟。

非确定性事件

在传统的锁步网络中,每回合仅发出玩家命令,其余模拟预计将在客户端之间确定性地进行。然而,某些游戏逻辑很难保持确定性,尤其是在 Unity 中,游戏引擎不提供任何此类保证。

在这种情况下,我确保非确定性游戏逻辑仅执行一次,并将结果作为其自己的操作以及玩家请求的操作一起发布。

例如,假设玩家攻击了一枚炸弹,导致其爆炸。玩家发出所有客户端执行的攻击动作。在炸弹爆炸的地方,需要检查周围区域,看看哪些单位会被击中。这是使用不确定的 Unity API 完成的。因此,只有一个客户端(可能是拥有炸弹的客户端)将进行此模拟并将结果(应该受到伤害的单位列表)作为新操作发送到服务器。通过这种方式,每个客户端的模拟仍然是相同的

如果存在作弊问题,服务器可以代替客户端来计算这些操作。这将要求服务器运行与客户端相同的模拟。这是我正在努力的方向,尽管目前客户仍然做出一些不确定的决定。

这种方法的优点是,仅当某些特定的游戏逻辑预计是不确定的时才需要发送额外的数据。任何确定性的事情(例如村民继续收集直到他们的资源已满)都不会使用任何额外的网络资源。它也比重写 Unity 功能以使其具有确定性更容易实现,尤其是在物理方面。

缺点是,如果我错了,认为某些事情是确定性的,但事实并非如此,它仍然会导致游戏不同步。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年跨境电商黄金赛道预测来了!跨境电商首选平台和品类有哪些?

跨境电商作为外贸新常态,在2023年已逐渐进入稳定增长的发展阶段,想必2024年跨境电商也会是一个向好的发展趋势,2024年做跨境电商,找准适合自己的电商平台和产品是成功的关键,今天东哥就对2024年的跨境电商黄金赛道做一…

【OpenAI】经营权争夺战关系图

《OpenAI新模型曝重大飞跃:AGI雏形或威胁人类,也成Altman被解雇导火索!》摘要如下: [一句话总结] OpenAI的Q*项目取得突破,解决了以前未见过的数学问题,为AI发展带来重要的技术里程碑。 [文章概览要点] OpenAI内部研…

小程序逆向工具 | 3秒抓取微信小程序源码

目录 一、工具准备 二、解密小程序 1、找到小程序包 2、解密小程序包 三、反编译小程序 1、安装依赖 2、执行反编译 四、完成 想成为一名微信小程序的开发者,前端思路的学习和安全意识是非常有必要的,故务必掌握小程序反编译技能。 这里用到了2…

【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型

1、阻塞队列(BlockingDeque) 首先我们来认识一下什么是堵塞队列 阻塞队列即实现了线程安全和阻塞的队列。在队列为空时,获取元素的线程会等待队列存放元素变为非空;在队列满时,存放元素的线程会等待队列取出元素变为不满。 阻塞队列常应用于生…

微信小程序实现类似Vue中的computed、watch功能

微信小程序实现类似Vue中的computed、watch功能 构建npm使用 构建npm 创建包管理器 进入小程序后,打开终端,点击顶部“视图” - “终端” 新建终端 使用 npm init -y初始化包管理器,生成一个package.json文件 安装 npm 包 npm install --…

【nlp】3.2 Transformer论文复现:1. 输入部分(文本嵌入层和位置编码器)

Transformer论文复现:输入部分(文本嵌入层和位置编码器) 1 输入复现1.1 文本嵌入层1.1.1 文本嵌入层的作用1.1.2 文本嵌入层的代码实现1.1.3 文本嵌入层中的注意事项1.2 位置编码器1.2.1 位置编码器的作用1.2.2 位置编码器的代码实现1.2.3 位置编码器中的注意事项1 输入复现…

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间,因为不仅要解决多业务系统数据质量标准不一问题,还需要进行大量的公式计算、报表设计与制作。但那是以前,在大数据分析工具强势崛起的当下,这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…

配电室智慧运维

配电室智慧运维是一种基于先进技术和智能化管理理念的配电室运维模式。依托电易云-智慧电力物联网,它结合云计算、物联网、大数据等技术,对配电室进行全方位的智能化管理和运维,旨在提高配电室的运行效率、安全性和可靠性。 配电室智慧运维的…

求臻医学六周年,我们的故事值得被记录

6载光阴求臻医学持续以科技创新推动产业升级在肿瘤精准诊疗领域持续深耕致力于为肿瘤患者生命续航每一位求臻人都是我们前进的力量也是我们不断创新的源泉我们不拘泥于一种声音以多元化的视角探索前行

发挥云计算潜力:Amazon Lightsail 与 Amazon EC2 的综述

文章作者:Libai 欢迎来到云计算世界,这里有无数的机会和无限的应用程序增长。 在当今的数字时代,企业可能会发现管理基础架构和扩展应用程序具有挑战性。 传统的本地解决方案需要大量的硬件、软件和维护前期投资。 要满足不断增长的需求&…

小型内衣裤洗衣机哪个牌子好?性价比小型洗衣机推荐

内衣内裤应该如何清洗才能实现在不伤衣的同时有能够洗干净呢?其实除了使用温水搭配手洗以外,还有一些清洗方式,那就是选择一台专门为内衣定制的内衣洗衣机。目前内衣洗衣机由于精致小巧,方便安装,方便使用,…

一元三次方程求解——浮点数二分

题目描述 思路 根与根之差的绝对值>1。可以得出距离为1的区间最多只有一个根若存在2个数x1和x2&#xff0c;且x1 < x2&#xff0c;f(x1) x f(x2) < 0&#xff0c;则(x1, x2)之间一定有一个根我们可以遍历每一个区间为1的范围&#xff0c;先判断左端点是否是根&#x…

python数据结构与算法-14_树与二叉树

树和二叉树 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序&#xff0c;堆排序先就此打住&#xff0c;因为涉及到树的概念&#xff0c;所以我们先来讲讲树。 讲完了树之后后面我们开始介绍一种有用的数据结构堆(heap)&#xff0c; 以及借助堆来实现的堆排序…

Hook+jsdom 解决cookie逆向

前言 记录下如何破cookie逆向 目标 目标网址:https://q.10jqka.com.cn/ 目标接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 对抗:cookie反爬虫处理,关键字v,如图 解决步骤 1、JS中关键字查找 如上,我们找到了关键字 v,…

Webstorm 插件文件目录颜色分析——白蓝绿红黄灰

Webstorm 插件文件目录【白色、蓝色、绿色、红色、黄色、灰色】对应当前文件发生什么了&#xff0c;即文件夹当前状态。 WebStrom配置好git或SVN后文件颜色代表的含义&#xff1a; 白色&#xff1a;本地无修改内容 蓝色&#xff1a;文件内容有修改&#xff0c;暂未提交到git…

Re51:读论文 Language Models as Knowledge Bases?

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Language Models as Knowledge Bases? ArXiv网址&#xff1a;https://arxiv.org/abs/1909.01066 官方GitHub项目&#xff1a;https://github.com/facebookresearch/LAMA 本文是2019年…

深度学习之基于Tensorflow卷积神经网络鸟类目标识别检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;在鸟类目标识…

淡入淡出transition: right 1s

transition: right 1s; //重点直接改变right值 操作过快 这里用该方法实现1s内淡入淡出 达到效果目标

35的程序员被辞了可以自己接外包啊?为什么都那么悲观呢?

35的年纪&#xff0c;上有老下有小&#xff0c;即将步入中年危机&#xff0c;在这个节骨眼上被辞&#xff0c;能不悲观吗&#xff1f; 在这个年纪人们往往追求的是稳定的工作和生活&#xff0c;而进入一个自己不熟悉的行业并不是一个好的选择。 况且&#xff0c;你认为的外包…

【考研】数据结构(更新到循环链表)

声明&#xff1a;所有代码都可以运行&#xff0c;可以直接粘贴运行&#xff08;只有库函数没有声明&#xff09; 线性表的定义和基本操作 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…