目录
Transport layer – TCP versus UDP
Preface
● 这就是本书的最后一章。在这里,我们讨论游戏编程的一个全新分支——networking。我们将讨论通过网络在设备之间交换数据。这可能是一个本地网络,也可能是连接太平洋两岸的网络。这在我们希望跨不同机器实现多人游戏体验的游戏中尤其有用。
然而,正如在前一章中所提到的,在本章不会对网络编程后的概念深入讲解。本章介绍了SFML的SFML网络模块及其与网络游戏编程常用架构(如客户端到客户端和客户端服务器)的连接。
在本章中,我们将介绍以下主题:
- Understanding networking
- The Transport layer—TCP versus UDP
- TCP with SFML
- UDP with SFML
- Exchanging packets
- Putting it all into practice
Understanding networking
● network 的概念已经存在了很长时间,但是如果我们要编写依赖于另一台机器信息的代码,掌握“network 背后的主要概念是很重要的。归根结底,network 就是向不同的机器发送和接收数据。这些数据可以用于多种用途——简单地将其重定向到另一个方向(如路由器)、执行任务并返回结果、更新数据库中的本地内容,等等。
从基础上说,如果两个系统希望在彼此之间交换数据,则它们需要位于同一个网络上(或位于相互连接的独立网络上)。这就像将以太网线从一张网卡连接到另一张网卡一样简单,创建一个相当简单的自组网(只在两台机器之间),但仍然能够很好地满足其目的。如果所有的网络都这么简单,机器之间的交互过程就会简单得多,但最终网络不会像今天这样有用。
当我们开始引入一些概念时,例如在同一个网络上有两台以上的机器、多个相互连接的网络、机器之间有很长的距离时,我们就开始遇到问题。这些解决方案涉及到巧妙的工程设计,我们不会深入讨论,但是结果是一个结构化的分层网络模型,这使得我们能够避免网络中固有的一些低级问题。这是模型的简化版本:
在本章中,我们将使用 application layer and Transport layer 中工作。当涉及到协议时,我们将处理TCP和UDP以通过网络传输数据。关于这个模型的更多信息可以在这里找到:http://wikipedia.org/wiki/osi-model。这涵盖了网络的基本概念。接下来我们将讨论游戏中的网络以及 比较TCP和UDP,因为它们都在游戏开发中得到了广泛的应用。
Networking in games
● 网络 (包括internet)在游戏中有许多用途,从简单的high-score table 到为大型多人在线游戏(MMO)运行服务器。网络最有趣(也可能是最困难)的用途是创建多人游戏。困难之处在于,我们必须在任何给定的时间上,然后在多个屏幕上显示相同的场景。当我们有很多动态对象、事件、玩家进出以及底层网络的质量变化时,这是非常困难的。程序员一直试图通过引入不同的网络设计体系结构来解决这些问题,其中最常见的是: peer-to-peer and client-server architectures(对等和客户机-服务器体系结构).
在网络编程的早期, Peer-to-peer被广泛使用。在这个架构中,每个设备与每个其他设备通信,以更新其本地的游戏模拟。下图显示了6个客户端(总共30个)之间的连接:
这在少数客户中很有效,但是当我们让更多的玩家加入时,宽带会成为一个问题(尤其是在慢速网络上,比如internet)。此外,该体系结构在处理同步时会遇到问题。例如,一个client可能在特定时刻检测到两个对象之间的冲突,这在另一个client上不会发生。选择哪一个是正确的并不容易,因为它们都是独立运行的,而且两个模拟在技术上都是有效的。 除此之外,client 很容易cheat ,因为系统中没有权限,他们可以选择性地忽略其他client发送的状态。为了解决这些问题并简化流程,存在另一种网络模型—— client-server.
client-server 模型在一个非常简单的基础上运行——一台服务器使用所有逻辑运行模拟,而clients 仅仅使用该模拟来显示其场景。在这个场景中,clients 没有运行任何模拟代码(理想情况下),但是它们从服务器获得每个动态对象的状态(位置、旋转等),并在该状态下显示该对象。设备之间的连接如下图所示:
一旦服务器更新了模拟,每个client 都会收到新的游戏状态,并在本地更新他们的对象。这几乎完全消除了同步问题,因为只有一个设备在运行模拟。对于不需要与其他所有client 通信的client 来说,它的带宽也更加友好。
peer-to-peer and client-server 这两个在不同的情况下都是有用的。“ Peer-to-peer ” is suitable for games which are designed to run on LAN or do not update their entities every frame, but only occasionally, as in turn-based games and point-and-clicks. 使用 peer-to-peer 的好处是,它的设置比 client-