Articles of 联网

在多人游戏中是否应该要求回应?

我不知道是否服务器响应客户端操作请求应该绑定一些操作ID? 绑定时将是: 1.客户端应用程序向服务器发送请求,例如购买项目X,并将操作ID设置为ID。 2.服务器响应操作ID和真或假。 这意味着使用该id的操作是否成功。 未解决的例子: 1.客户端应用程序向服务器发送请求以例如购买项目X. 2.服务器只响应一个项目X的更新数据,在那里提到新的项目所有者。 通过这种方式,客户端可以检查所有者名称是否与自己的名称相同,如果是,则假定该项目已成功购买。 同样的回复数据可以发送给其他客户,让他们知道项目X是被某人购买的。 哪种方法更好? 恕我直言解开是更好,更简单的实施,但感觉就像可以有这么多的边缘情况,我现在没有看到。

我应该使用线程来检查多人游戏的套接字吗?

在多人游戏中,获取/发送信息从/到套接字的代码驻留在游戏循环中还是属于它自己的线程?

处理基于实时音乐/节奏的游戏的延迟

假设我正在制作一个合作的多人音乐节奏游戏 – 两个玩家并肩移动他们的光标/头像,用鼠标左右移动,并尝试击中或躲避正在向他们走来的障碍物。 这里的问题是,如果连接有延迟,比如说B方向200毫秒,那么当玩家A接收到玩家B的移动时,已经太晚了 – 玩家在轨道上的位置将会提前当它被发送的时候。 在两个玩家互相等待以确认他们各自的input的同时,还有一个问题,就是音乐必须在两个玩家的客户端上毫不拖延地继续播放,否则会听起来非常波动,播放器动作可能与节奏不一致,这不是我们想要的。 我们如何处理这个延迟?

服务器到客户端的更新率

我正在构建一个使用客户端 – 服务器体系结构的游戏,并且有关于服务器到客户端更新的以下问题。 目前,服务器每秒执行60个刻度,并且在每一步之后都会向所连接的客户端发送更新,这意味着有关世界上每个实体的信息。 由于我的游戏比较慢,基于rts,所以很多实体在每一步之后都不会改变状态,也不需要更新。 所以为了减less服务器负载,我添加了更新队列。 只有需要更新的实体才会被添加到该队列中,并在每个步骤之后执行。 看这个方法,我想知道是否有任何重大的缺点。 我能想到的一点是,随着时间的stream逝,游戏变得越来越复杂,无论如何,每一步都需要更新所有的实体,这可能只是浪费时间来实现。

什么是一些很less提到的networking模型/策略?

最近我一直在思考多人游戏和networking游戏,而且我发现了大量的信息,但是我觉得可能会有一些标准的模式或者networking策略,我从来没有见过。 有明显的客户端 – 服务器模型,使用客户端作为发送击键并接收关于其他实体的位置信息的terminal。 我相信有一种点对点的模式 – 两个客户端如何在没有专用服务器的情况下玩游戏(在局域网中看到很多)。 有一个客户端预测策略,允许客户端控制播放器,同时等待延迟时间来为服务器返回服务器的实际位置 – 保持按键logging,以使修正看起来顺畅。 在服务器超负荷的情况下,我已经看到了一种战略,把一些像AI这样的工作奉献给客户。 我已经在DayZ mod中看到过…客户在接近时会控制一些僵尸。 有没有明显的或很less见到的战略或模型,上面列出的简要说明中的错误,或者对这个主题的深层部分有额外的解读?

UDK ping检查不join游戏?

我在为UDK创建定制的服务器浏览器方面取得了很大的进展。 它向主服务器注册服务器,客户端可以下载列表并填充服务器浏览器。 不过,我想告诉用户在服务器浏览器中的服务器的ping。 我知道PlayerReplicationInfo有一个服务器检查本机function,但只有当播放器实际连接到服务器时才起作用。 我想ping一下服务器而不join它,然后收集数据显示给玩家? 这很容易实现吗? 难以实施? 也许这是浪费时间,因为需要ping所有可能的服务器所需的时间? 如果很容易实现,我该怎么做呢? 我是否需要制作一个自定义的TCPLink类来计算消息来回传递的时间?

在多人虚幻引擎中产生多个演员

你好,我目前正在努力与我正在进行的一个项目。 这是一个使用虚幻引擎4制作的video游戏,我必须在项目中实现networking部分。 所以首先我们拥有玩家所拥有的倍数棋子,每个玩家都可以产生棋子(可以是不同types的棋子)。 我们目前正在使用一个网格(一个演员)来存储世界上所有的块。 我们正在使用一个网格管理器(一个UObject)来管理网格。 GridManager可以创建AActor : BuildingAction , PushAction , FallingAction以及可以应用到网格中任何块的所有其他操作。 所以我知道,为了产生这些动作和块,我需要从PlayerController或PlayerController调用RPCS。 问题在于,由于网格管理器管理网格并产生对世界的操作,所以这些操作在多人游戏中不起作用。 我想在播放器控制器中产生它们是可行的,但是它需要一个函数用于每个types的块和一个用于播放器控制器上的每种types的动作的函数,将这些函数存储在播放器控制器上是没有意义的。 如果有人能帮助我find一个在networking上进行这项工作的好方法,那将是非常有帮助的。

在线多人游戏 – 作弊瓦特/三角洲时间运动

我正在制作基本的线性移动和插值的多人游戏。 我读过gabriel关于客户端预测和服务器和解的文章 ,并尝试将其应用于我自己的文章。 我的服务器应该是权威的,但我担心客户仍然可以利用这个系统。 系统的工作原理是这样的: 客户端在60hz发送时间戳input到服务器 服务器运行在30hz。 每个记号都应用自上次logging以来的所有input,并使用从客户端input数据包计算出的时间增量来确定移动(例如,entity.x + = message.delta *速度)。 然后,服务器将时间戳状态发送回所有客户端。 客户端从服务器接收到一个定时的状态并应用“授权”位置。 我关心的是第二步。 由于玩家的移动依赖于客户端的德尔塔时间,恐怕他们可以通过向服务器发送一个“虚假的德尔塔时间”来作弊,并且更快地join垃圾信息input消息以使其在游戏中更快地移动。 如果我完全消除德尔塔时间,游戏会出现“跳动”。 我该如何解决这个问题?

Nat穿梭使用Unity.Networking不使用Matchmaking服务器? 可能吗? 另外,如果我们始终在家里托管我们自己的服务器呢?

我和朋友在Unity里做了几场比赛。 我们一直在使用Unity HLAPInetworking管理器和networking管理器HUD。 游戏连接到UNET的Matchmaking服务器,但我们并不真的认为这是一个选项,我们将使用,由于所涉及的成本。 我们制作的游戏也可以使用networking管理器资源中内置的IP和端口设置进行连接。 a)所以我们要添加多人游戏的第一款游戏是一款双人飙车游戏。 正如我所说,如果用户放入其他用户的外部IP地址,并且该人已经正确转发了端口7777,那么我们可以通过互联网连接并彼此玩。 但是,当然在发布游戏时,我们希望代码自动发现外部IP,并转发端口7777,以便用户只需点击“主机”即可将游戏作为“客户端 – 主机 – 服务器”场景(我希望这是有道理的,我相信,如果他是主机,那么他显示为“服务器”的基本统一码,请纠正我,如果我错了:]) 我一直在阅读和研究NAT穿透的很长一段时间。 我没有声称完全知道它做什么或如何,但林相当肯定这是我需要为了得到这个2播放器设置,而不用input的IP和端口的用户。 b)我们考虑过的另一个选项(这可能是我们为其他游戏做的方式,更像是Fortnite BR(哈哈!),我们将会有一个服务器总是打开,连接到我们的互联网静态IP和DMZ /端口转发,我们有这个工作与2个客户端,也是一个电话客户端login在同一时间。 我的问题是::我看到这个资产,并认为购买: https : //www.assetstore.unity3d.com/en/#! /content/ 58948 – 但描述谈到使用Matchmaking服务器。 如果不使用Matchmaking Unity服务器,这个资产是否有帮助? 另外,任何人都可以指出我对如何达到上述a)或b)的任何直接帮助? 非常感谢您的阅读

一个MMORPG服务器应该排队的数据包

我不知道在哪里问这个问题。 我有一个服务,我们将调用GameDB连接到一个MySQL数据库。 这个GameDB是与数据库交互的唯一服务。 我有另一个服务器,我们会打电话给GameSV模拟世界等。 在某些时候,GameSV将数据包发送到GameDB,然后GameDB根据数据包数据更新数据库中的一些logging。 当我踢出GameSV的所有玩家进行一些维护时,会发生奇怪的事情。 GameDB应该在这一点上保存一些数据。 每个连接的用户约10个更新/插入语句。 所以如果有500个用户在线并同时踢了,GameDB会尝试同时更新/插入大约5000条logging。 这是我注意到一些数据没有提交/更新数据库。 虽然这只有在我同时踢全部球员时才会发生。 目前,GameDB的编码方式是一旦它到达并直接更新/插入到数据库中,就会处理数据包。 没有在应用程序级别排队。 我明白,TCP / IP已经排队数据包本身。 所以现在我认为它一定是数据库。 但所有这些只是一个猜测。 所以我的问题是, 请问使用队列来排队数据包有什么不同? 你怀疑别的东西是真正的罪魁祸首吗? 我是一个业余networking游戏开发者,所以我不确定服务器的devise。 如果有问题,我正在使用Go-lang的服务。