当前位置: 首页 > 知识库问答 >
问题:

如何使用客户机-服务器体系结构在游戏中高效地发送对象

胡意致
2023-03-14

我做了一个联网的2d自上而下的射击游戏。它相当标准,用户使用WASD移动他们的玩家,并且可以使用12345和鼠标施法。用户必须杀死敌人并保持生命。

我已经将它联网,让多个用户在同一个竞技场上玩,但运行效率太低。

精灵存储在字典中

其实施如下:

  1. 用户的键盘和鼠标输入会在每一帧发送到服务器(KeyboardState,MouseState)

不幸的是,这使得游戏速度非常慢。我只在一台机器上测试了这个,所以没有延迟,所以我假设发送的数据太多了。

要解决这个问题,我想我要么需要高效地存储和发送数据,要么以不同的方式实现。

为了有效地发送它,我认为我需要将数据打包为字节并发送它,但我不知道如何做到这一点。

我如何高效地发送数据,或以不同的方式实现数据,以使其高效?


共有1个答案

梁丘亦
2023-03-14

尽量减少穿越网络的数据量。只发送所需的数据量,并通过时间戳和验证提供您自己的验证。

下面的每个actionId和AnimationId应该显示最小的字节数(2的幂),以唯一地描述所有可能的值。

服务器-

服务器已知的客户端位置和轮换。确认最后的actionId。客户端视野内所有其他客户端位置、方向(轮换)、动画ID的列表-MaxRotationRate在MaxView远程距离-maxMovementRate的距离内。

客户端必须在每个步骤中平均当前位置与服务器位置。

本地处理所有输入(鼠标和键盘),仅将相关数据发送到服务器:

每次更新,客户端都会发送相关数据并更新自己的内部状态并处理给定的服务器状态,并增加int值(称其为时间戳)。在这里包括奇偶校验或CRC。

客户-

所有渲染决策、视口、当前动画/精灵/颜色都应在客户端上建立(颜色和初始位置需要在登录时提供给客户端)。

将共享位置数据(本地更新和服务器调整)。

每次更新都需要将位置、旋转和速度数据(线性和旋转)发送到服务器。服务器收到后,必须进行验证过程以防止作弊。在更新丢失、无序或格式错误时,服务器将采用最后位置速度*(与最后时间戳当前服务器时间的时间差)。

您必须使用UDP进行通信(请注意,您使用自己的时间戳和CRC来验证接收到的数据,不再出现无效数据崩溃的情况)。

仅处理奇偶校验/CRC检查通过的数据包,并拒绝接收到的太短或未通过检查的数据包。这些检查将消除与坏数据包相关的崩溃。

TCP的重试机制和有序交付不利于游戏性能。每次单个数据包丢失或按顺序交付时,由于服务器重试和数据包重新排序,时间增量错误(发送数据的时间与服务器处理数据的时间)会因RTT(往返时间,即ping时间)而增加。这将导致多秒延迟,只会随着游戏的进行而增加。

网络延迟和丢弃/格式错误的数据包是游戏中常见的情况。如果是基于时间戳值的无序数据包,请除去最后一个数据包以外的所有数据包,因为这表示玩家的最新愿望(移动)。射击时(在你的情况下施法),持续发送法术位直到确认(ActionId)。忽略服务器上除第一个收到的咒语以外的所有咒语(向客户端发送确认),直到充值期结束。

虽然此答案排除了原始问题中未提出的所有要点,主要是损坏,但应创建一个结构,当根据定义的损坏分布规则分布损坏的服务器上产生损坏诱发元素时,需要将其应用于每个受影响的客户端。

 类似资料:
  • 创建Eureka发现客户端和服务器架构。在客户端有userInfo服务CRUD opeartion。它在启动时显示错误。错误是创建在类路径资源[org/springFramework/cloud/autoconfiure/ConfigurationProperty tiesRebinderAutoConfiguration.class]中定义的名为“配置属性Beans”的bean的错误:合并bea

  • 我想要将获得的统计数据存储在服务器端数据库中,但我不太确定基本值。具体到一款移动游戏,我在想应该尽量减少来回传递的数据量。 在客户端存储这些项目/字符的基本值,使用Prefab/Scriptable对象(我使用的是Unity)是不是一个坏主意?战斗将在客户端进行,服务器主要处理对玩家游戏数据数据库的读/写。玩家之间的主要互动将不会是玩家之间的实时战斗,而是类似于氏族冲突的东西。

  • 在开发我的在线游戏时,我试图了解更多关于安全的知识。 截获从服务器发送的数据包、使用某些软件修改数据包并将数据发送回服务器是否可能,以及有多困难? 下面是一个场景: 玩家与AI敌人进行战斗。一个玩家输掉了这场战斗,在战斗结束时,数据包被发送回服务器,记录发生的事情。是否可以在发送之前修改此数据包,并告诉服务器玩家已经赢得了这场战斗?如何读取并修改这些数据? 是否有可能说玩家与1个敌人进行了一场战斗

  • 对不起我的英语-如果有些事情不清楚,请在评论中问我-我会澄清这一点。 我用微服务架构构建系统。我有一项关于用户信息的服务,一项关于“提供”的服务,还有一项关于“想法”的服务。服务“提供”和“想法”在登录和其他操作时与“用户”服务通信(通过RESTfulAPI)。我想知道如何处理电子邮件?每个服务都有独立的前端,并在某些操作后发送电子邮件(例如,当某个第三方打开与某个报价的链接时,创建此报价的用户将

  • 我想在我的LibGDX Android游戏中使用Google Play Game Services API的成就和排行榜。我所做的唯一一件事就是从游戏服务开发者网站上获取运行的示例。我已经尝试在我的项目中使用这段代码很多天了,但仍然一无所获。我也尝试过学习本教程http://helios.hud.ac.uk/u1070589/blog/?p=202但我没有“主游戏类(从ApplicationLis

  • 问题内容: 我正在制作客户端服务器MMO风格的游戏。到目前为止,我已经建立了框架,以便服务器和客户端相互交互以提供状态更新。服务器维护游戏状态并定期计算下一个状态,然后每隔一段时间(每n毫秒)将其发送给所有客户端。用户可以在客户端查看此新状态并做出反应。然后,将这些操作发送回服务器进行处理,并发送给下一次更新。 明显的问题是这些更新在服务器和客户端之间传播需要花费时间。如果客户端采取行动攻击敌人,