Questions tagged «networking»

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

3
为什么某些联网游戏使用插值而有些使用寻路来进行远程移动?
这是一个悬而未决的问题,但我希望看到有人为这两者做出良好的推理。 举两个例子: 插值模型 考虑一下Valve模型,其中客户端经常接收位置更新,而远程设备使用此数据上的插值来更新其位置。 寻找路径 在此模型中,认为用户发送了目的地,并且每个人都找到了目的地。 什么类型的游戏适合每种游戏,什么时候应该使用?

5
游戏技巧的技巧,以避免处理网络滞后补偿?
实施网络滞后补偿很难,如何避免呢? 也许可以使用技巧并建立游戏机制,从而将滞后视为非关键甚至是游戏的自然组成部分? 这些技术是什么,是否有使用这些技术的现有游戏(MMORPG,策略等)? 更新: 回合制游戏不需要时滞补偿,但是有趣的是可以看到实时的方法(或者仅仅是实时的印象,这是重要的部分-不应阻止用户并强迫其等待)。 我避免滞后补偿的主要原因是简单性。
20 networking  mmo  rpg  rts  lag 

3
如何使多人游戏在NAT之后可靠地工作?
当客户端位于NAT之后,即使是100%客户端/服务器的游戏有时也会出现问题。小便对等游戏甚至是更大的问题。某些游戏需要使用多种传输方式(例如UDP和TCP)或多种连接方式(例如用于语音的其他UDP端口)。 有什么方法可以确保游戏在NAT路由器后面运行时可靠运行? 对等:不存在集中式服务器。玩家A开始游戏,而玩家B想加入 客户端-服务器:知名地址(主机名)上的集中式服务器接受所有传入连接。每个客户端仅与该服务器通信。 组合:服务器只是配对,但游戏更新是对等的。不同的对等方可能会看到每个播放器具有不同的IP /端口(例如,某些客户端位于同一NAT之后,而某些客户端位于不同的路由器上)

10
MMO在PvP期间如何/应该如何处理断开连接?
在MMO(甚至不一定是MMORPG)中,有哪些技巧可以处理玩家在PvP中间断开连接的问题? 特别是-您如何避免对因网络(甚至现实生活)问题而断开连接的人们造成不利影响,而又不对与他们互动的人们造成不利影响? 而且,重要的是,如何确保断开连接不能用作作弊方法?

5
在现代多人游戏中,巨大的静态对象(如环境)是否从服务器传输到客户端?
我有一个权威的系统,当玩家加入比赛时,它会获取所有已经生成的对象-本身(客户端)生成的对象。 看起来像这样: Client 将访问令牌发送到 Server Client 收到来自 Server Client 将场景切换到游戏场景 Server发送玩家,板条箱,可以与之互动的对象,以便client生成并显示它们。 但是地面物体呢?现在,我在服务器和客户端上具有完全相同的场景-以一个静态平面作为地板。目前,我正在添加新的东西,树木,楼梯并一起构建东西。 我以为-我们很好。但是环境也应该不同步吗?是否以某种方式联网?由服务器拥有? 让我们来League of Legends: 这是一个静态环境,可能是一个组合的网格(楼梯,草地,墙壁,商店)。但是它是真正保留在客户端上还是由服务器在加载屏幕期间发送?
18 unity  networking  maps 

9
实时调试技术
完全没有什么比调整例程的例程,编译需要花费几分钟时间的代码,执行代码,意识到您的调整方向错误并再次重复该过程的例程更多的了。 我想在进行会话时开始与我的游戏逻辑进行交互。您处理过的方法有哪些? 我很乐意听到iOS,C / C ++和C#/ XNA的解决方案。

4
如何在网络游戏中以可靠的方式分配实体ID?
我正在为网络游戏开发一个实体系统,并为每个实体分配一个唯一的32位整数ID,该ID可用于序列化对实体和实体本身的引用。 目前,我只是在每次创建实体时增加一个计数器。我想这些ID最终会用完,但我并不真正希望拥有40亿个实体。如果实体#5被销毁并且我们获得ID为5,这也避免了问题。这是指引用新的#5还是旧的已删除的#5? 问题是我不确定如何处理/避免冲突。当前,如果客户收到一个ID高于其当前“免费ID”的实体的更新,则该客户的免费ID会超过该值。但这似乎不是很可靠。 我考虑过为每个客户端分配范围,以便他们可以分配实体而不会发生冲突(例如,前n位是玩家编号),但是我担心如果范围随时间开始重叠会发生什么情况。 有没有更好的方法来解决这个问题?我是否应该担心ID溢出或超出允许范围的末尾?我可以添加代码来检测这些情况,但是如果发生这些情况而不是崩溃,该怎么办。 另一种选择是使用具有更高独特性的功能,例如128位GUID,但对于试图最小化网络流量的游戏而言,这似乎是重量级的。而且,实际上,我永远不会一次需要更多实体,而是适合一个32位甚至24位整数。 谢谢!

4
一个简单的UDP游戏涉及什么?
我曾经尝试在一周内用UDP编写一个简单的游戏作为一次性测试。太可怕了。 我很早就把它扔了。我遇到的主要问题是将所有玩家/敌人/物体的游戏状态恢复为旧状态,并将游戏快速移至玩家正在玩的时间点(即,跳前半秒)。让玩家错过跳跃) 也许这种方法不是最简单的方法?我怀疑是这样,但我从一开始就设计错误,并在第二天结束时意识到。(所以我没有学太多或浪费了很多时间) 对于我自己和其他人,一个简单的UDP游戏涉及什么,我该怎么写?或如何解决恢复正确状态的预测问题。 我将其标记为CW bc,我知道会有很多有用的答案。

5
什么是更好的?很多小的TCP数据包,还是一个很长的TCP数据包?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 关闭 4年前。 我正在为自己制作的游戏在服务器之间发送大量数据。 我目前发送这样的位置数据: sendToClient((("UID:" + cl.uid +";x:" + cl.x))); sendToClient((("UID:" + cl.uid +";y:" + cl.y))); sendToClient((("UID:" + cl.uid +";z:" + cl.z))); 显然,它正在发送各自的X,Y和Z值。 这样发送数据会更有效吗? sendToClient((("UID:" + cl.uid +"|" + cl.x + "|" + cl.y + "|" + cl.z)));
16 networking 

5
实时策略游戏联网
我正在为我修读的计算机科学课程开发实时策略游戏。它最困难的方面之一似乎是客户端-服务器网络和同步。我已经阅读了这个主题(包括1500个archer),但是我决定采用客户端-服务器方法,而不是其他模型(例如,通过LAN)。 这种实时策略游戏存在一些问题。值得庆幸的是,玩家采取的每项行动都是确定性的。但是,某些事件按计划的时间间隔发生。例如,游戏是由砖块组成的,当玩家拿下一块砖块时,“能量水平”(该砖块上的一个值)在被获取后应该每秒增加一。这是一个非常简短的解释,应该可以证明我的用例。 现在,我正在做瘦客户机,它们只是将数据包发送到服务器并等待响应。但是,有几个问题。 当玩家之间的游戏发展为残局时,每秒通常会有超过50个事件(由于已安排的事件,如前所述,堆积),然后开始显示同步错误。我最大的问题是,即使客户之间的状态偏差很小,也可能意味着客户做出不同的决定,这些决定会滚雪球变成完全独立的游戏。另一个问题(目前还不那么重要)是存在延迟,必须等待几毫秒,甚至是他们采取行动才能看到结果的几秒钟。 我想知道我可以使用什么策略和算法使最终用户更轻松,更快速,更有趣。鉴于每秒发生的事件数量很高,而且每场比赛有几个玩家,因此这特别有趣。 TL; DR以每秒> 50个事件的速度生成RTS,如何同步客户端?

4
使用UDP的确认可靠性
我对UDP有疑问。对于上下文,我正在开发实时动作游戏。 我已经阅读了很多有关UDP和TCP之间的区别的文章,并且我对它们的理解非常好,但是其中有一件从未感觉过正确,那就是可靠性,尤其是致谢。我了解默认情况下UDP不提供可靠性(即数据包可能会被丢弃或乱序发送)。当需要某种可靠性时,我所见的解决方案(从概念上讲是有意义的)是使用确认(即服务器向客户端发送数据包,并且当客户端收到该消息时,它将确认发送回服务器)。 。 取消确认后会发生什么? 在上面的示例中(一台服务器向一个客户端发送数据包),服务器通过每帧重新发送数据包直到收到针对这些数据包的确认,来处理潜在的数据包丢失。您仍然可能会遇到带宽问题或消息混乱的情况,但是仅从丢包的角度来看,服务器已被覆盖。 但是,如果客户端发送了从未到达的确认,则服务器别无选择,只能最终停止发送该消息,如果需要该数据包中包含的信息,这可能会破坏游戏。您可以对服务器采取类似的方法(即一直发送确认,直到收到确认的确认?),但是这种方法会使您永远来回循环(因为您需要为确认而需要一个确认)等等)。 我觉得这里的基本逻辑是正确的,这给了我两个选择。 发送单个确认包,并希望最好。 发送少量确认数据包(可能是3-4个),并希望达到最佳状态,前提是并非所有数据包都将被丢弃。 这个问题有答案吗?我是从根本上误解了吗?是否可以保证使用我不知道的UDP?我对继续使用太多的网络代码感到犹豫,直到我对自己的逻辑是合理的感到满意为止。
16 networking  udp 

2
如何使Quake 3等精密网络游戏的服务器-客户端时钟保持同步?
我正在研究2D自上而下的射手,并尽力复制类似Quake 3这样的网络游戏中使用的概念。 我有一个权威服务器。 服务器将快照发送到客户端。 快照包含时间戳和实体位置。 实体插值在快照位置之间,因此移动看起来很流畅。 根据需要,实体插值会稍微“过去”发生,因此我们可以在多个快照之间进行插值。 我面临的问题是“时钟同步”。 为了简单起见,让我们假设一下,在与服务器之间传输数据包时,延迟为零。 如果服务器时钟比客户端时钟早60秒,则快照时间戳将比客户端本地时间戳早60000ms。 因此,在客户端看到任何给定的实体进行移动之前,实体快照将收集并静置约60秒钟,因为客户端时钟要花很长时间才能赶上。 通过设法在每次接收快照时计算服务器时钟和客户端时钟之间的差异,我设法解决了这一问题。 // For simplicity, don't worry about latency for now... client_server_clock_delta = snapshot.server_timestamp - client_timestamp; 确定实体插入插值的距离时,我只需将差值添加到客户的当前时间即可。但是,这样做的问题是,由于快照比其他快照更快或更慢地到达,这两个时钟之间的差异将突然波动,这将导致混乱。 如何才能使时钟足够紧密地同步,以使唯一可感知的延迟是硬编码用于插值的延迟,而该延迟是由普通网络延迟引起的? 换句话说,如何在时钟严重失步时防止插值开始得太晚或太早而又不引起混乱呢? 编辑:根据Wikipedia的说法,NTP可以用于在几毫秒内将互联网上的时钟同步。但是,该协议似乎很复杂,也许在游戏中使用会显得过分杀伤力?

3
如何同时有效地编码客户端和服务器?
我正在使用客户端-服务器模型编写游戏代码。在单人游戏上玩时,游戏会启动本地服务器,并像远程服务器(多人游戏)一样与之交互。我这样做是为了避免编写单独的单人和多人代码。 我刚刚开始编码,遇到了一个主要问题。目前,我正在Eclipse中开发游戏,并将所有游戏类组织到软件包中。然后,在服务器代码中,我只使用客户端软件包中的所有类。 问题是,这些客户端类具有特定于呈现的变量,显然不会在服务器上执行。 是否应该创建客户端类的修改版本以在服务器中使用?或者我应该只使用布尔值修改客户端类,以指示其客户端/服务器是否在使用它。我还有其他选择吗?我只是想过也许将服务器类用作核心类,然后通过渲染内容对其进行扩展?

2
游戏主机应该是授权机构,还是另一个愚蠢的客户?
当设计一个网络多人游戏时,一个玩家托管,另一个玩家连接,我知道两种策略: 让主机玩家的游戏为权威,所有其他玩家为哑客户端,试图赶上当前的游戏状态。在代码中,将有很多特殊情况,具体取决于当前播放器是否是主机。 通过在另一个线程上运行隐藏的专用服务器,使主机像其他所有人一样成为哑客户端。专用服务器将成为授权者,而主机将像其他所有人一样(通过localhost)连接到它。 每种优点/缺点是什么?哪个是最常用的(或者它因游戏类型/大小而异)?

3
我应该将登录服务器与游戏服务器分开吗?
我正在考虑制造MMO服务器,并且一直在研究其他游戏如何构建其网络。我注意到的一件事是,总是有一个登录服务器,然后是游戏服务器。 我仍在决定是否应该这样做,但是我想先听听一些意见。这样有什么好处,登录服务器如何与游戏服务器通信以处理登录?

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.