Questions tagged «networking»

通过电缆绑定或无线通信链接将两台或更多台计算机连接在一起,以进行信息交换。

2
UDP非阻塞还是单独的线程来接收?
我正在创建一个多人游戏(适用于64位以下的玩家)。我已经决定为网络循环设置一个单独的线程,但是我想知道是否最好创建一个额外的线程来接收UDP或将接收套接字设置为非阻塞(没有额外的线程)。 还是使用其他方法(例如异步套接字)更好?始终欢迎更好的方法!

1
多人平台游戏-服务器上的单个客户端通常是否需要服务器更正?
我目前正在开发一个相当简单的多人平台游戏。我阅读了很多有关隐藏延迟的技术的文章,但是仍然无法理解某些概念。我觉得这个话题非常有趣,喜欢自己尝试一些想法,但我认为询问gamedev stackexchange对于我的问题会更有效。我将尽力描述我的当前状况以及在此过程中出现了什么问题。 现在,我只想让一个播放器与服务器同步。从理论上讲,我假设一个具有客户端预测功能的玩家不需要服务器修正,因为没有外部因素会影响他的动作。因此,我的原型目前只有一个播放器与服务器同步,而没有发送服务器更正。 如果您熟悉游戏网络,我认为您可能会跳过上下文部分,尽管在此过程中我也可能做错了什么。 客户端循环(每帧一次,每〜16.67ms一次) 简化的客户端循环如下所示: 检查本地输入(WASD)并将其打包为操作(例如Type=MoveLeft, Time=132.0902, ID=15)。我们保留打包的操作,以便最终在以后发送它们。此外,我们将所需的动作直接应用于游戏的本地物理模拟。例如,如果我们有一个MoveLeft动作,我们会向玩家的速度向左施加一个力。 检查发送动作。为了防止滥用客户端的带宽,请仅按特定间隔(例如30ms)发送打包的操作。 应用服务器修改。在某个时候,这将处理服务器接收到的增量和更正,并将其应用于游戏的本地模拟。对于此特定问题,不使用。 更新本地物理。在主播放器上运行物理循环。基本上,这是客户端对玩家运动的预测。这会增加玩家的速度引力,将玩家的速度应用到他的位置,修复沿途的碰撞等。我应该指定物理模拟始终以固定的增量秒执行(根据实际增量秒多次调用) 。 我跳过了有关物理学和其他部分的一些特定详细信息,因为我认为这些不是问题所必需的,但是请随时让我知道它们是否与问题相关。 服务器循环(每15ms) 简化的服务器循环如下所示: 处理动作。检查从客户端收到的操作包,并将其应用于服务器物理仿真。例如,我们可以收到5个MoveLeft动作,然后将力施加到速度5次。重要的是要注意,整个动作包是在一个“框架”上执行的,与客户端在动作发生后立即应用它相反。 更新游戏逻辑。我们会更新游戏物理性,移动玩家并修复碰撞等。我们还会打包以后碰巧发送给玩家的所有重要事件(例如,玩家的健康状况下降,玩家死亡等)。 发送更正。如果他们最近改变了,我们会定期(例如,每35毫秒发送一次)将差值发送给其他玩家(例如,玩家的位置,健康状况等)。该部分目前尚未实现,因为我希望单个播放器的模拟在客户端和服务器上给出相同的结果而无需更正,以确保客户端的预测工作正常。 问题 当前的系统在简单的情况下仍然可以正常工作,而令我惊讶的是它在简单的水平移动下给出了非常相似的结果(我相信,这种误差是由于浮点精度误差引起的): 请忽略原型图形。白色矩形=播放器,红色矩形=障碍物,蓝色=背景 但是,在进行时间敏感的动作(例如跳跃和移动到孤立的障碍物附近)之后,出现同步错误: 从理论上讲,我希望两者总是能得到相同的结果,因为没有任何外部因素影响客户的立场。不过,在实践中,我认为我理解问题所在。 由于围绕这样的障碍物跳跃非常取决于玩家的时机,因此将速度应用于位置时的微小变化将对结果产生影响(例如,客户可以及时移开以避免与障碍物,而服务器会在稍后接收到整个动作包时执行该操作,并停留在障碍物上一小段时间,从而更改最终结果)。客户端和服务器处理方式之间的区别主要在于,客户端在发生所有操作时都会执行所有操作,而服务器在接收到它们时会批量执行所有操作。 问题 如此长的语境最终引发了我的问题(感谢您阅读到目前为止):即使只有一个播放器与服务器同步,要求服务器更正是否正常,还是应该在某些对时间敏感的情况下使用某些技术来避免不同步? ? 我已经想到了某些可能的解决方案,其中一些我不太满意: 实施服务器校正。只需假设这是正常行为并纠正错误即可。无论如何,我都想实现它,但是我只是想确保到目前为止所做的事情是可以接受的。 使用提供的客户端时间来应用所需的操作。我想这与滞后补偿类似,需要“及时返回”并检查运动。有点像应用服务器更正,回到过去,然后重新应用下一个操作。我真的不喜欢这个主意。它看起来很复杂,资源昂贵,并且需要信任客户的给定时间(尽管我确实打算真正检查时间是否相对合法)。 向GameDevelopment StackExchange提出一个很棒的新想法,它将解决我的所有问题。 我才刚刚进入游戏网络世界,所以请随时纠正/批评/侮辱上述任何概念,或者提供一些想法/资源,这些资源可以帮助我在“网络奇妙世界”中发展。如果可以在其他地方找到答案,请原谅我,但我失败了。 非常感谢您的宝贵时间。

1
发送播放器速度更改时如何同步客户端和服务器?
我正在执行客户端预测。大多数说明都假定客户端发送诸如“ 将我的播放器上移1个位置 ”之类的消息。如果我发送诸如“ 将播放器的速度设置为x ”之类的消息怎么办? 在客户端上,播放器在服务器之前设置自己的速度(通过客户端预测),导致两者不同步。即使考虑平均延迟,此问题仍然存在。 我该如何解决?

4
防止多人作弊
我几乎完成了一款小型独立式多人游戏的开发。虽然我打算允许人们在单人游戏中作弊,但在多人游戏中这显然是不可接受的。有谁知道有什么方法可以阻止普通的Joe使用Cheat-Engine之类的东西来修改游戏的某些部分?我目前计划让客户端每隔几秒钟将游戏使用的每个设置文件的MD5哈希值(存储为XML)上载到游戏服务器进行验证,但是我能做些什么来阻止内存编辑器等操作。 ?

3
最佳的点对点游戏架构
考虑一种设置,其中游戏客户端: 拥有非常小的计算资源(移动设备,智能手机) 都连接到通用路由器(LAN,热点等) 用户想在没有外部服务器的情况下玩多人游戏。 一种解决方案是在一台电话上托管一台权威服务器,在这种情况下,它也是一个客户端。考虑到第1点,此解决方案是不可接受的,因为电话的计算资源不足。 因此,我想设计一个点对点架构,该架构将在客户端之间分配游戏的模拟负载。由于第2点,系统的优化不必太复杂;延迟将非常低。每个客户都可以是有关他本人及其周围环境的权威数据来源(例如项目符号)。 设计这种架构的最佳方法是什么?是否存在此类LAN级别对等协议的任何已知示例? 笔记: 这里解决了一些问题,但是那里列出的概念对我来说太笼统了。 安全 我知道没有一台权威服务器是一个安全问题,但是在这种情况下这无关紧要,因为我愿意信任客户端。 编辑: 我忘了提:这将是一个节奏相当快的游戏(射击游戏)。 另外,我已经在Gaffer on Games上阅读了有关网络体系结构的文章。

3
MMO是否需要了解黑客机制?
说我正在计划,将来(不是现在!我需要首先学习很多东西)希望参加一个小组项目,该小组项目将制作大型多人在线游戏(mmo),而我的工作将是网络一部分。我对网络编程不是很熟悉(我读过一本关于PHP,MYSQL的非常基础的书,并且对WAMP有点了解)。 在学习PHP和MYSQL的过程中,我应该研究黑客吗?在端口扫描,路由器黑客等中进行黑客攻击。在MMO中​​,人们总是在试图欺骗,机器人等,但最糟糕的情况是有人入侵数据库。这只是我的构想,我真的不知道。但是,我确实非常了解网络,例如子网划分/端口/ IP(本地/全局)/ etc。 以您的专业意见,(如果您理解该主题,请启发我)我是否应该了解这些事情以应对这种情况的发生? 另外,除了我提到的内容(端口扫描,路由器黑客攻击)之外,还有其他与黑客攻击有关的事情值得我关注吗?我对网络的恶意/安全方面不太熟悉。 还有一个注意事项:我不是要学习如何破解的小孩子。我只是想在上大学之前尽可能多地学习,而且我真的需要知道是否需要学习。


1
网络客户端-服务器消息交换和时钟同步帮助
我正在做一个快节奏的物理游戏,它是桌上曲棍球。有两个槌和一个冰球。游戏运行在iPhone / iPad上,我正在通过GameCenter做多人游戏。 这就是网络系统的工作方式。带有匹配标记的客户端将作为服务器进行结算,接受匹配请求的将是客户端。 “服务器”具有物理功能,响应是即时的,客户端也具有物理功能,因此在消息交换之间看起来很流畅。我作为服务器的工作是,我将客户的冰球速度和位置发送给客户端,客户端调整与服务器有关的冰球速度/位置以使其保持同步。否则,物理场将失去同步,并且将其拧紧。 当网络延迟很好,在100毫秒以下时,效果很好,我在客户端获得了流畅的可玩游戏,并且怪异的行为降到了最低。当滞后时间约为150到200毫秒时,就会发生此问题。在那种情况下,发生了我的客户冰球已经碰到边缘和反向的情况,但是它收到了来自服务器的延迟消息,并且它后退了一点,从而引起了对球行为的怪异感觉。 我已经阅读了一些有关它的内容: 傍网示例 单击同步示例 维基百科上的时钟同步 那么,我该如何解决呢?据我所知,最好的选择是使用时间戳在服务器/客户端上进行时钟同步,这样当我收到与时钟相关的延迟消息时,我就忽略了,然后让客户端模拟执行工作。你们同意吗?而且由于我发送的数据不可靠(UDP),所以我可能会收到延迟的消息或混乱的消息。 如果那是最好的方法,我如何实现时钟同步。我已经阅读了有关如何操作的步骤,但我不太了解。 它说: 客户端在“时间请求”数据包上标记当前本地时间,然后发送给服务器。 服务器收到后,服务器会在服务器上盖章并返回 客户端收到后,客户端从发送时间中减去当前时间,然后除以2以计算延迟。它从服务器时间中减去当前时间,以确定客户端-服务器时间增量,并加上半延迟以获取正确的时钟增量。(到目前为止,此algothim与SNTP非常相似) 客户重复步骤1至3五次或更多次,每次都暂停几秒钟。在此期间可能允许其他流量,但应将其最小化,以获取最佳结果。数据包接收的结果将被累积,并以最低延迟到最高延迟的顺序进行排序。中值等待时间是通过从此有序列表中选择中点样本来确定的。 丢弃与中位数相差大约1个标准偏差的所有样本,并使用算术平均值对其余样本取平均值。 按照这个例子,我会有这个: 让我们假装游戏已经加载并且我的客户端时间现在是0,所以我向服务器发送我的时间是0。 消息需要150毫秒才能到达服务器,但是服务器的时钟已经启动,并且比客户端提前1秒。服务器收到消息后,时间将是:1.15并将该时间发送给客户端,我们还好吗?假设我们的滞后时间恒定为150ms。 现在客户端接收时间1.15,并从发送的时间中减去当前时间,然后除以2以计算延迟。Wich为:0.3-0 = 0.3 / 2-> 150ms。 它从服务器时间中减去当前时间以确定客户端-服务器时间增量,并添加半延迟以获取正确的时钟增量: 客户端时间:0.3服务器时间1.15 0.3-1.15 = .85 +等待时间(.15)= 1 如何同步?我想念什么? 这是我第一次玩多人游戏和网络游戏,所以我有点困惑。 谢谢。

3
实时策略游戏中的网络
当前网络实时战略游戏的最新状态是什么? 我似乎还记得几年前,一些AAA冠军只传递了玩家的信息(《星际争霸1》,《帝国时代》)。由于这需要您完全确定所有其他内容,因此这仍然是可行的选择吗?同步随机数生成器似乎是可行的,但是FPU实现中的细微差别如何? 还是战略游戏使用的是更接近动作游戏网络的东西,而是传输单个实体(使用某种形式的预测和(增量)压缩)? 如果是这样,如何处理弹丸等易挥发物品? 客户端/服务器与点对点呢?我猜所有这些都是紧密相关的。 感谢您的时间!

5
如何处理网码?
我对评估网络代码可以“融入”游戏引擎的不同方式感兴趣。我现在正在设计一个多人游戏,到目前为止,我已经确定(至少)需要一个单独的线程来处理网络套接字,这不同于处理图形循环和脚本的引擎其余部分。 我确实有一种使网络游戏完全为单线程的潜在方法,那就是在使用非阻塞套接字渲染每一帧后让它检查网络。但是,这显然不是最佳方法,因为渲染帧所花费的时间增加了网络延迟:通过网络到达的消息必须等待,直到当前帧渲染(和游戏逻辑)完成为止。但是,至少以这种方式,游戏玩法仍将或多或少保持平稳。 拥有独立的网络线程可以使游戏完全响应网络,例如,它可以在收到来自服务器的状态更新后立即发送回ACK数据包。但是我对在游戏代码和网络代码之间进行通信的最佳方式有些困惑。网络线程会将接收到的数据包推送到队列中,并且游戏线程将在其循环期间的适当时间从队列中读取数据,因此我们没有摆脱这种长达一帧的延迟。 另外,似乎我希望处理数据包发送的线程与检查管道中的数据包的线程是分开的,因为它不能在发送过程中将其发送出去。检查是否有传入消息。我在考虑select或类似功能。 我想我的问题是,设计具有最佳网络响应能力的最佳方法是什么?显然,客户端应该将用户输入尽快发送到服务器,这样我就可以在事件处理循环之后立即在游戏循环内部发送净发送代码。这有意义吗?

6
网络傍克隆
我具有TCP套接字,UDP通信等基础知识,但是在如何将它们应用于实时游戏环境方面找不到很多。 我有一个Pong克隆,有4个播放器,并且需要在三个客户端和服务器(服务器是第四个播放器)之间同步桨位置。目前,我使用UDP发送实时更新(桨式运动),并使用TCP设置游戏大厅等。 散发大量UDP流量是否是坏事?我是否应该研究类似DCCP的拥塞功能?还是这样的小规模项目真的不是问题吗? 客户端/服务器之间何时应发送同步消息?目前,服务器正在以其可以管理的最快速度向UDP数据包发送垃圾邮件,而客户端也在以最快的速度向其服务器发送垃圾邮件位置。这是最好的方法吗?我是否应该添加某种延迟,以便每X毫秒发送一次消息,还是仅在事件发生时才发送消息?(例如,桨叶速度由于用户输入而改变) 使客户端之间的点对点交流更好吗? 我在Pong的背景下问这些问题,但也对在其他游戏或通用解决方案中如何克服这些问题感兴趣。

3
与全状态更新相比,我如何更有效地同步多人游戏状态?
我之前已经做过一些游戏网络编码,但是主要使用TCP来实现无实时需求的游戏。我正在使用网络多人游戏开发2D Java游戏。为了学习,我想自己做,而不需要现有的网络API。 如何有效表示从服务器发送给客户端的游戏状态?有一种最明显但可能效率最低的方法,该方法是使用每个玩家的位置,动画状态等创建某种游戏状态上下文对象,并将每次更新发送给每个玩家。这似乎很难实现,但可能太大而无法实现接近实时交互的功能(当然,我的经验有限,因此我可能是错误的)。 你们中的任何人以前是否曾使用过可靠的方法来仅传输状态变化,并且在性能上是否存在足够大的差异以值得进行额外的工作?

5
为什么在Vector3s中不能使用运算符'> ='?
我正在尝试获得一个矩形,以便在我称为_positionA和的两个位置之间移动_positionB。两者都是类型Vector3。矩形移动得很好。但是,到达时_positionB它不会像应该的那样朝相反的方向移动。 我回到代码中看一看。我得出的结论是,随着对象的移动,if代码中的语句错过了rects位置等于的框架_positionB。如果rects的位置大于或等于, 我决定将代码修改为反向_positionB。我的代码不太长,因此我将在下面显示它: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

3
如何避免被节制?
我正在写一个联网的iOS游戏。当以每秒60个数据包(即相邻数据包之间的16毫秒)发送数据包GKMatchSendDataReliable(我假设是UDP并写有自己的数据包接收代码)时,平均ping时间迅速恶化:我在下面打开了7个GameCenter匹配项(一个接一个) ),然后简单地发送了100个数据包(每秒60个数据包)。我测量了平均往返时间,结果如下: [ 21:16:39 ]: I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms [ 21:16:34 ]: I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms [ 21:16:45 ]: I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms …
9 networking  udp 

2
服务器端输入
当前在我的游戏中,客户端不过是渲染器。当输入状态更改时,客户端将数据包发送到服务器,并像对待输入一样处理播放器,但是服务器保留最终决定权。 除了一个大问题:掉落边缘,这通常效果很好。基本上,如果玩家正朝着一条边走,比如说一个悬崖,并且在走出边缘之前就停下来了,有时是一秒钟之后,他将被传送到边缘之外。这是因为在服务器处理信息后发送了“我停止按W”数据包。 这是一个滞后图,可以帮助您理解我的意思:http : //i.imgur.com/Prr8K.png 我可以每帧发送一个“ W Pressed”数据包供服务器处理,但这似乎是带宽成本很高的解决方案。 任何帮助表示赞赏!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.