在线多人游戏基础知识


9

我目前正在实时开发ac#在线多人游戏。目的是使用UDP协议建立基于客户端/服务器的连接。到目前为止,我已经使用UDP进行玩家的移动,并使用TCP进行事件(玩家射击,玩家丧命),因为我需要确保这些数据将到达连接到服务器的所有玩家。我知道UDP被称为“不可靠”,并且某些数据包可能会丢失。但是我到处都读到永远不要混用TCP和UDP,因为它会影响连接。

主要问题是我应该如何组织我的网络?

UDP是无连接的,我该如何保存谁是谁?我应该在列表中保存客户端的IP地址吗?

我应该使用TCP处理重要事件还是使用UDP?如果需要使用UDP,如何确保数据不会丢失?

通过同时使用TCP和UDP,我需要为每个播放器将其IP保存在一个列表中(用于UDP),并将TcpClient保存在另一个列表中(对于UDP)。我如何才能使其更有效?


@JoshPetrie这个问题是合法的“主要问题是我应该如何组织我的网络?”。我不应该使用这个或那个。OP使用一种技术,并且需要有关添加他已经选择的另一项技术的建议。答案很广泛,不在于应使用哪种技术,而在于软件的结构如何避免管道膨胀,减少滞后并提高可靠性,而与底层技术无关。
郊狼

它也太广泛了。该问题应进行编辑(随意这样做,它已经很老了)以使其更具话题性,然后可以将其重新打开。

Answers:


6

UDP的开销较小,但是以丢失数据包而不知道它为代价(TCP的部分开销可确保重新发送丢失的数据包)。

但是,使用UDP的最大问题是,有许多站点阻止了所有UDP流量(DNS除外),因为许多管理员认为这是一种很好的安全做法。

另外,不要假设您的每个玩家都会有不同的IP地址-在许多情况下,多个用户共享同一个Internet连接,如果小学生迷上了您的游戏,您可以打赌他们可能是会弄清楚如何在上课时安装和运行它,而不是去做(这不是您想让他们在您的游戏上而不是在别人身上花费这宝贵的时间吗?)。

一旦打开TCP流,它仍然非常有效。下一步是最大程度地减少发送/接收的数据量,这就是协议设计起作用的地方。如果您只为每个命令发送几个字节(例如,“向前移动”),而不是例如将同一命令包装在数百个字节的XML代码中,那么您的整体网络带宽消耗将降低,CPU周期也将减少需要处理这些信息(相对于分解,解释和语法检查大量XML而言,很容易比较几个字节)。

当然,您可以打开多个TCP流并将其用于不同的目的,例如一个用于命令,另一个用于图形传输,另一个用于基于音频的聊天等。这样,如果您要传输一个需要5-10的大型图形只需下载几秒钟,至少播放器命令的移动不会滞后,因为它们将处于不同的流中(并且您可以显示默认的Sprite,直到新的Sprite完成下载为止,这总是比等待更有趣)。


1
最初的问题提到了客户端-服务器模型,因此阻止所有UDP的“站点”是无关紧要的。那是客户端的问题,我怀疑许多客户端是否确实会阻止所有UDP。“使用TCP是开发网络游戏时可能犯的最严重的错误!要理解为什么,您需要查看TCP在IP之上实际上正在做什么,以使一切看起来如此简单!” 参见gafferongames.com/networking-for-game-programmers/udp-vs-tcp
确实是2011年

@ indeed005:这有优缺点-UDP确实确实提供了性能上的优势,但是却以可靠性为代价(这正是TCP所具有的优势)。至于UDP阻止,您绝对正确,这是客户端的问题,但是在许多公司和教育环境中,我遇到了UDP(端口53除外)被笨拙的管理员阻止的人,他们认为UDP是安全问题,并且因此,客户端选择回退到TCP的选项至少可以表示玩家可以体验游戏(尤其是在网络带宽足够快的情况下)。
兰道夫·理查森2011年

@ indeed005:同样,使用UDP和TCP的混合也是可以接受的,因为TCP可以用于较低优先级的数据传输,而UDP可以用于高速操作方面。还要注意的是,IPv6有一些可用的新选项(IPv4尚不可用)可以满足游戏的实时需求,而本质上却不是无连接的,但是我认为距IPv6尚需时日可以被游戏利用而不必依赖IPv4(这很不幸,因此,我们目前尽最大努力使用IPv4)。
兰道夫·理查森

3

这不是您问题的直接答案,但是gafferongames在网络游戏上有一些非常不错的文章:http ://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -游戏网络/


链接
断开
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.