RakNet项目中的FullyConnectedMesh2插件详解
概述
FullyConnectedMesh2是RakNet网络库中的一个重要插件,专门用于解决点对点(P2P)游戏网络中的两个核心问题:如何正确加入一个全连接网络以及如何自动确定和迁移会话主机。这个插件为开发者提供了一套完整的解决方案,使得构建稳定的P2P网络架构变得更加简单可靠。
核心功能
1. 正确加入全连接网络
在P2P游戏中,新玩家加入时需要与所有现有玩家建立连接。FullyConnectedMesh2通过验证加入机制确保这一过程的可靠性:
- 验证加入流程:采用多步骤验证机制,确保新节点能够正确连接到所有必要节点
- 容错处理:自动处理连接失败情况,避免部分连接导致的网络不一致
- NAT穿透支持:与NAT穿透功能无缝集成,解决网络地址转换带来的连接问题
2. 主机确定与迁移
- 自动主机选举:基于系统运行时间自动选择最稳定的节点作为主机
- 主机迁移:当原主机离线时自动选举新主机,保证网络持续可用
- 主机状态通知:通过事件通知所有节点主机变更情况
使用流程详解
加入全连接网络的步骤
-
基础配置:
- 所有系统调用
SetConnectOnNewRemoteConnection(false, "")
- 所有系统调用
SetAutoparticipateConnections(false)
- 所有系统调用
-
主机端操作:
- 当新系统连接并被允许加入时,主机调用
StartVerifiedJoin()
- 当新系统连接并被允许加入时,主机调用
-
客户端操作:
- 收到
ID_FCM2_VERIFIED_JOIN_START
后,调用GetVerifiedJoinRequiredProcessingList()
获取需要连接的节点列表 - 尝试连接列表中的所有系统,使用NAT穿透等辅助技术
- 处理各种结果通知:
ID_FCM2_VERIFIED_JOIN_FAILED
:连接失败ID_FCM2_VERIFIED_JOIN_REJECTED
:主机拒绝加入ID_FCM2_VERIFIED_JOIN_ACCEPTED
:成功加入网络
- 收到
主机确定机制
-
参与者注册:
- 不使用验证加入时,需为每个新连接调用
AddParticipant()
- 不使用验证加入时,需为每个新连接调用
-
主机查询:
- 使用
GetHostSystem()
和IsHostSystem()
查询当前主机 - 等待
ID_FCM2_NEW_HOST
事件确认主机计算完成
- 使用
-
游戏启动:
- 必须在主机确定后才能开始游戏逻辑
- 处理游戏过程中的主机迁移
最佳实践
-
主机计算重置:
- 在从单机模式切换到网络模式前调用
ResetHostCalculation()
- 避免因系统运行时间导致的主机选举偏差
- 在从单机模式切换到网络模式前调用
-
事件处理:
- 正确处理
ID_FCM2_NEW_HOST
事件 - 区分首次主机确定和主机迁移情况
- 正确处理
case ID_FCM2_NEW_HOST:
{
if (packet->guid==rakPeer->GetMyGUID())
printf("Got new host (ourselves)");
else
printf("Got new host %s, GUID=%s",
packet->systemAddress.ToString(true),
packet->guid.ToString());
RakNet::BitStream bs(packet->data,packet->length,false);
bs.IgnoreBytes(1);
RakNetGUID oldHost;
bs.Read(oldHost);
if (oldHost==UNASSIGNED_RAKNET_GUID)
{
// 首次主机确定,可以开始游戏
}
break;
}
技术优势
- 网络稳定性:确保所有节点间的全连接状态,避免部分连接问题
- 自动恢复:处理节点加入失败、主机迁移等复杂场景
- 灵活性:可与NAT穿透等网络辅助技术协同工作
- 易用性:通过清晰的事件机制简化开发流程
FullyConnectedMesh2插件为P2P游戏网络提供了可靠的基础设施,开发者可以专注于游戏逻辑实现,而将复杂的网络管理交给插件处理。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考