RakNet项目中的FullyConnectedMesh2插件详解

RakNet项目中的FullyConnectedMesh2插件详解

RakNet RakNet is a cross platform, open source, C++ networking engine for game programmers. RakNet 项目地址: https://gitcode.com/gh_mirrors/ra/RakNet

概述

FullyConnectedMesh2是RakNet网络库中的一个重要插件,专门用于解决点对点(P2P)游戏网络中的两个核心问题:如何正确加入一个全连接网络以及如何自动确定和迁移会话主机。这个插件为开发者提供了一套完整的解决方案,使得构建稳定的P2P网络架构变得更加简单可靠。

核心功能

1. 正确加入全连接网络

在P2P游戏中,新玩家加入时需要与所有现有玩家建立连接。FullyConnectedMesh2通过验证加入机制确保这一过程的可靠性:

  • 验证加入流程:采用多步骤验证机制,确保新节点能够正确连接到所有必要节点
  • 容错处理:自动处理连接失败情况,避免部分连接导致的网络不一致
  • NAT穿透支持:与NAT穿透功能无缝集成,解决网络地址转换带来的连接问题

2. 主机确定与迁移

  • 自动主机选举:基于系统运行时间自动选择最稳定的节点作为主机
  • 主机迁移:当原主机离线时自动选举新主机,保证网络持续可用
  • 主机状态通知:通过事件通知所有节点主机变更情况

使用流程详解

加入全连接网络的步骤

  1. 基础配置

    • 所有系统调用SetConnectOnNewRemoteConnection(false, "")
    • 所有系统调用SetAutoparticipateConnections(false)
  2. 主机端操作

    • 当新系统连接并被允许加入时,主机调用StartVerifiedJoin()
  3. 客户端操作

    • 收到ID_FCM2_VERIFIED_JOIN_START后,调用GetVerifiedJoinRequiredProcessingList()获取需要连接的节点列表
    • 尝试连接列表中的所有系统,使用NAT穿透等辅助技术
    • 处理各种结果通知:
      • ID_FCM2_VERIFIED_JOIN_FAILED:连接失败
      • ID_FCM2_VERIFIED_JOIN_REJECTED:主机拒绝加入
      • ID_FCM2_VERIFIED_JOIN_ACCEPTED:成功加入网络

主机确定机制

  1. 参与者注册

    • 不使用验证加入时,需为每个新连接调用AddParticipant()
  2. 主机查询

    • 使用GetHostSystem()IsHostSystem()查询当前主机
    • 等待ID_FCM2_NEW_HOST事件确认主机计算完成
  3. 游戏启动

    • 必须在主机确定后才能开始游戏逻辑
    • 处理游戏过程中的主机迁移

最佳实践

  1. 主机计算重置

    • 在从单机模式切换到网络模式前调用ResetHostCalculation()
    • 避免因系统运行时间导致的主机选举偏差
  2. 事件处理

    • 正确处理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;
}

技术优势

  1. 网络稳定性:确保所有节点间的全连接状态,避免部分连接问题
  2. 自动恢复:处理节点加入失败、主机迁移等复杂场景
  3. 灵活性:可与NAT穿透等网络辅助技术协同工作
  4. 易用性:通过清晰的事件机制简化开发流程

FullyConnectedMesh2插件为P2P游戏网络提供了可靠的基础设施,开发者可以专注于游戏逻辑实现,而将复杂的网络管理交给插件处理。

RakNet RakNet is a cross platform, open source, C++ networking engine for game programmers. RakNet 项目地址: https://gitcode.com/gh_mirrors/ra/RakNet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌昱有Melanie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值