RakNet:著名开源网络引擎,用于网络游戏、多人联机游戏。
架构分析:
分为三大模块:network communication, plugins that use network communication, and general game functionality
核心是network communication,分为RakPeer和TCPInterface。游戏状态同步用的是RakPeer,基于UDP协议。某些业务如补丁升级用的是TCPInterface。RakPeer会创建2个线程,一个线程用于阻塞式的recvfrom(),另一个线程用于周期性的发包如保活检测、RTT检测、MTU探测等。收到的包会放到一个线程安全的队列中,用户线程每次主循环都调用RakPeer::Receive()来读取期间所有收到的消息。用户发送给RakPeer的消息,会在一个RakPeer发送周期整合成一个报文。
基本架构如下:
其实它的核心代码大量的工作都花在了用UDP模拟出一个近似TCP的效果,从功能上来说,只是比TCP增加了几种传输方式:UNRELIABLE,UNRELIABLE_SEQUENCED,RELIABLE,RELIABLE_ORDERED,RELIABLE_SEQUENCED。以发送1,2,3,4,5,6数据为例,各传输方式下接收端收到的包为:
UNRELIABLE - 5, 1, 6
UNRELIABLE_SEQUENCED - 5 (6 was lost in transit, 1,2,3,4 arrived later than 5)
RELIABLE - 5, 1, 4, 6, 2, 3
RELIABLE_ORDERED - 1, 2, 3, 4, 5, 6
RELIABLE_SEQUENCED - 5, 6 (1,2,3,4 arrived later than 5)。
目的只有一个,就是想去掉TCP的丢包重传机制。用UNRELIABLE_SEQUENCED传输方式,游戏的数据不需要每包都必达从而避免丢包重传,因为新的包代表新的状态,直接用新状态即可,不用非要等旧的包到达。TCP的丢包重传会花费比较多的时间(ping值的1.5倍)造成网络延迟。
Plugin代码都是在构建在核心代码之上,提供一些网络游戏或多人游戏常用的功能。
发现其他玩家方式:输入IP直连,局域网广播搜索然后连接,服务器Room管理连接,或者服务器提供玩家列表用来连接。
互联方式:主要还是用Master/Slave方式实现多机互联。也提供了单独服务器(就是网游的方式)连接的功能,和p2p的功能。但p2p方式其实除了聊天外其他情景没法儿用。单独服务器用来给Console Game互联太浪费也意义不大,并且编程复杂度要高很多。
组队:可以通过它的TeamBalancer plugin来建立队伍。
补丁系统:如果玩家之间版本不一样,可以通过从Master那里下载补丁来达到版本一致,RakNet提供AutopatcherServer and AutopatcherClient plugins,FileListTransfer plugin and the DirectoryDeltaTransfer plugin实现这一功能。
游戏结果成就上传:游戏结束后有类似积分之类的数据需要上传到服务器的,可以用LobbyServer and LobbyClient来实现。需要有单独的服务器并且为每个用户建立一个账号。
聊天:
——未完,后续会更新补充。