目录
一、插件介绍
Unity插件-Mirror使用方法(一)Mirror介绍-CSDN博客
二、主要组件
Unity插件-Mirror使用方法(二)组件介绍-CSDN博客
Network Manager
Unity插件-Mirror使用方法(三)组件介绍(Network Manager)-CSDN博客
Network Manager HUD
Unity插件-Mirror使用方法(四)组件介绍(Network Manager HUD)-CSDN博客
Network Identity
Unity插件-Mirror使用方法(五)组件介绍(Network Identity)-CSDN博客
Network Transform
Unity插件-Mirror使用方法(六)组件介绍(Network Transform)-CSDN博客
Network Animator
Unity插件-Mirror使用方法(七)组件介绍(Network Animator)-CSDN博客
Network Behaviour
Unity插件-Mirror使用方法(八)组件介绍(Network Behaviour)-CSDN博客
Network Start Position
Unity插件-Mirror使用方法(九)组件介绍(Network Start Position)-CSDN博客
Network Room Manager
Unity插件-Mirror使用方法(十)组件介绍(Network Room Manager)-CSDN博客
Network Room Player
Unity插件-Mirror使用方法(十一)组件介绍(Network Room Player)-CSDN博客
Network Discovery
Unity插件-Mirror使用方法(十二)组件介绍(Network Discovery)-CSDN博客
Network Authenticators
Unity插件-Mirror使用方法(十三)组件介绍(Network Authenticators)-CSDN博客
三、KCP Transport
1、组件介绍
KCP Transport 是 Unity Mirror 中基于 KCP 协议的网络传输层实现,专为需要低延迟、高可靠性的实时多人游戏设计。相较于传统的 TCP 和 UDP,KCP 在保证可靠性的同时显著减少延迟,尤其适合动作游戏(如 FPS、MOBA)或高频交互场景(如 VR 协作)。
项目地址:https://github.com/vis2k/kcp2k
KCP Transport 是 Mirror 框架默认的传输组件,基于高效的 KCP 协议 实现,专为低延迟和高可靠性设计。
技术实现
底层依赖:基于 UDP 协议,通过 KCP 算法实现可靠传输。
代码来源:
原始 KCP 实现:skywind3000 (kcp.c)
C# 移植版本:limpo1989 (kcp-csharp)
连接处理优化:paul/lymdum/uwee
使用步骤
添加组件
- 在
NetworkManager
游戏对象上添加 KCP Transport 组件。
配置网络
- 确保防火墙/路由器解除对 UDP 端口 7777(默认端口)的封锁。
- 若需修改端口,需同步调整组件参数。
2、核心优势
- ✅ 100%纯C#实现
全平台支持(WebGL 除外),无需依赖原生代码。- 🚀 极速性能
相比传统 TCP,平均延迟降低 30%~40%,最大延迟减少三倍。- ⚡ 近乎零内存分配
优化内存使用,减少GC压力(除初始连接阶段外)。- 📊 高测试覆盖率
代码测试覆盖率达 83.5%,确保稳定性。- 🔄 简单易用
开箱即用,无需复杂配置。
KCP 协议优势
KCP 是一种快速可靠协议,通过算法优化实现以下效果:
1.带宽代价:比 TCP 多消耗 10%~20% 带宽。
2.实现方式:
- 用户需自定义底层数据包的传输方式(如基于 UDP)。
- 通过回调函数将数据传递给 KCP,外部管理时钟(无系统调用)。
低延迟传输
- 通过 ARQ(自动重传请求)优化,减少丢包时的重传等待时间。
- 支持 Nagle 算法禁用(NoDelay 模式),避免数据包合并带来的延迟。
高效可靠
- 在 UDP 基础上实现选择性重传,仅重传丢失的包,而非整个数据流。
- 内置 FEC(前向纠错) 选项,通过冗余数据降低丢包影响。
灵活配置
- 提供窗口大小、超时时间、MTU 等参数调节,适应不同网络环境(如 4G、Wi-Fi、高丢包网络)。
跨平台支持
- 兼容 Windows、Linux、macOS、Android、iOS 等平台。
3、关键配置参数
参数分类 | 参数名称(英文) | 参数值 | 功能说明 | 备注 |
---|---|---|---|---|
Transport Configuration(传输配置) | Port(端口) | 7777 | 指定KCP协议使用的UDP端口号。 | 默认端口为7777,需确保防火墙/路由器开放此端口。 |
Dual Mode(双栈模式) | 启用 | 支持IPv4和IPv6双协议栈,允许同时处理两种地址类型的连接。 | 适用于需要兼容IPv6的网络环境。 | |
No Delay(无延迟模式) | 启用 | 禁用Nagle算法,减少数据包发送延迟,提升实时性。 | 适合对延迟敏感的游戏场景(如FPS、MOBA)。 | |
Interval(间隔时间) | 10 | KCP内部轮询间隔(单位:毫秒),控制协议处理频率。 | 值越小,响应越快,但CPU占用可能增加。 | |
Timeout(超时时间) | 10000 | 连接无响应时的超时断开时间(单位:毫秒)。 | 默认10秒,建议根据网络稳定性调整。 | |
Recv Buffer Size(接收缓冲区大小) | 7361536 | 接收缓冲区容量(单位:字节),用于临时存储待处理数据。 | 过小可能导致丢包,过大可能增加内存占用。 | |
Send Buffer Size(发送缓冲区大小) | 7361536 | 发送缓冲区容量(单位:字节),用于临时存储待发送数据。 | 同上。 | |
Advanced(高级设置) | Fast Retransmit(快速重传) | 2 | 触发快速重传的重复ACK阈值。当收到指定次数的重复ACK时,直接重传丢失的数据包。 | 默认2次,可减少因偶发丢包导致的等待时间。 |
Receive Window Size(接收窗口大小) | 4090 | 接收端滑动窗口大小(单位:数据包数量),限制未确认数据的最大数量。 | 窗口越大,吞吐量越高,但内存占用增加。 | |
Send Window Size(发送窗口大小) | 4096 | 发送端滑动窗口大小(单位:数据包数量),限制未确认数据的最大数量。 | 需与接收窗口匹配,建议保持默认值。 | |
Max Retransmit(最大重传次数) | 40 | 单个数据包的最大重传次数,超过后断开连接。 | 防止因持续丢包导致资源浪费。 | |
Maximize Socket Buffers(最大化Socket缓冲区) | 启用(勾选) | 自动将客户端和服务端的发送/接收缓冲区设置为操作系统(OS)允许的最大值,避免高负载下因缓冲区过小导致连接被丢弃。 | 若默认操作系统限制仍不足,需手动调整OS的缓冲区上限(如修改 /etc/sysctl.conf 或注册表参数)。适用场景:大规模玩家在线、高频数据传输环境。 | |
Reliable Max Message Size(可靠消息最大大小) | 297433 | 可靠传输通道允许的单条消息最大字节数。 | 超过此大小的消息会被拆分发送。 | |
Unreliable Max Message Size(不可靠消息最大大小) | 1195 | 不可靠传输通道允许的单条消息最大字节数。 | 适用于对实时性要求高但允许丢包的消息(如位置同步)。 | |
Debug(调试) | Debug Log(调试日志) | 启用 | 输出详细的传输层日志,用于排查网络问题。 | 建议仅在开发阶段启用,避免性能损耗。 |
Statistics GUI(统计界面) | 启用 | 在游戏画面中显示实时网络统计面板(如带宽、延迟、丢包率)。 | 便于监控网络状态,默认位置在屏幕左上角。 | |
Statistics Log(统计日志) | 启用 | 定期将网络统计数据记录到日志文件。 | 可用于后期分析网络性能。 |
4、使用步骤
1. 安装与配置
-
通过 Unity Package Manager 或 GitHub 仓库导入 Mirror KCP Transport。
-
在
NetworkManager
组件中,将 Transport 切换为 Kcp Transport。 -
配置端口和参数(如服务器端口
7777
,客户端自动连接)。
2. 代码示例
// 启动服务器
NetworkManager.singleton.transport = GetComponent<KcpTransport>();
NetworkManager.singleton.StartServer();
// 客户端连接
NetworkManager.singleton.networkAddress = "192.168.1.100";
NetworkManager.singleton.StartClient();
3. 自定义参数调整
public class CustomKcpSettings : MonoBehaviour {
void Start() {
KcpTransport kcp = GetComponent<KcpTransport>();
kcp.NoDelay = true; // 禁用延迟优化
kcp.FastResend = 2; // 快速重传
kcp.SendWindowSize = 256; // 高带宽环境增大窗口
}
}
5、高级功能
1. 前向纠错(FEC)
通过冗余数据减少丢包影响(需权衡带宽):
kcp.FecDataShards = 3; // 数据分片数
kcp.FecParityShards = 1; // 冗余分片数
2. 动态 MTU 适配
根据网络状况自动调整 MTU:
void Update() {
if (NetworkServer.active) {
kcp.Mtu = DetectOptimalMTU(); // 自定义MTU探测逻辑
}
}
3. 流量统计
监控网络吞吐量与丢包率:
Debug.Log($"发送速率: {kcp.BytesSentPerSecond / 1024} KB/s");
Debug.Log($"丢包率: {kcp.PacketLossPercentage}%");
6、适用场景
场景 | 优势 |
---|---|
实时竞技游戏 | 低延迟确保玩家操作即时反馈(如射击、格斗)。 |
大规模 PvP 战斗 | 高效处理高频小数据包(如技能释放、位置同步)。 |
弱网络环境 | 通过 FEC 和快速重传维持连接稳定性(如移动4G网络)。 |
VR/AR 多人协作 | 减少交互延迟,提升沉浸感。 |
7、常见问题与解决
问题 | 解决方案 |
---|---|
客户端无法连接 | 检查防火墙是否放行 UDP 端口,确认 Dual Mode 配置正确。 |
高延迟波动 | 降低 Interval 值,启用 NoDelay ,或减少 SendWindowSize 。 |
带宽占用过高 | 调低 SendWindowSize ,禁用 FEC,或增大 MTU 。 |
移动端频繁断线 | 增加 Timeout 和 MaxRetransmitAttempts ,优化网络切换处理逻辑。 |
8、性能对比(KCP vs TCP vs UDP)
指标 | KCP | TCP | UDP |
---|---|---|---|
延迟 | 低(优化重传) | 高(拥塞控制) | 最低(无重传) |
可靠性 | 高(自动重传) | 高(内置保证) | 无(需手动实现) |
带宽效率 | 中等(冗余控制) | 高(流控制) | 最高(无额外开销) |
适用场景 | 实时竞技、高频交互 | 文件传输、回合制 | 音视频流、快节奏 |