5.4 网络问题排查工具箱与速查手册

基础三件套

工具/命令 用途 触手可得
stat net 实时带宽、ping、丢包、TickRate 控制台一行
stat game / stat unit 线程耗时(游戏/渲染/物理) 区分「网络卡」还是「机器卡」
showdebug replication /相关 cvar 复制对象数、相关 Actor 列表 控制台

进阶:

  • 网络仿真(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/using-network-emulation-in-unr-ca3f):模拟延迟/丢包/抖动——开发期造差网络
  • 网络性能分析器(Network Profiler,https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/using-the-network-profiler-in-8330):抓一段时间的网络包,看哪些 Actor/属性最费带宽
  • Unreal Insights 的 Networking Insights(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/networking-insights-in-unreal-e91d):帧级 trace 网络事件,与 CPU 帧时间对齐分析
  • 网络调试官方汇总:「网络调试」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/network-debugging-for-unreal-e-2b2a)「测试和调试多人游戏」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/testing-and-debugging-networke-1645)

网络性能分析器实战步骤

  1. 控制台 netprofiler start → 玩一段典型场景(团战、跑图)→ netprofiler stop
  2. 打开分析器,按「Out bytes」排序,找 Top 10 Actor
  3. 点开 Actor,看是哪些属性在刷:通常是某个高频属性或一个胖结构体
  4. 对 Top 1~3 逐个优化(降频率、条件复制、拆结构体、FastArray)
  5. 重测,直到带宽预算达标
症状 第一步看什么
「服务器 CPU 高、客户端卡」 stat unit:服务器 TickRate 有多低
「带宽报警」 网络分析器 Top Actor + 属性排序
「玩家瞬移」 是预测校正(日志+CMC)还是复制频率过低
「Join 后黑屏/无角色」 服务器日志的 Login 链 + 客户端 Role 打印
「只有部分玩家看不到 X」 相关性配置 / NetCullDistanceSquared / bAlwaysRelevant
「跨端血量不一致」 是否客户端直接改了复制属性(查写入点)

日志规范(排查效率的根基)

每条关键日志带三要素:端(Server/Client+编号)、Actor、Role:

UE_LOG(LogNetGame, Warning, TEXT("[C%d] %s OnRep_Health: %s | Role=%d"),
    LocalPlayerNum, *GetName(), *FString::SanitizeFloat(Health), (int32)GetLocalRole());

这套日志在「跨端状态不一致」类问题里是唯一快速定位的手段。生产环境关键路径建议用 Warning 级以上,确保上传。

常见错误信息对应表

日志/现象 根因
Net(Guid related) guide mismatch 客户端本地按 Guid 找不到对象(常见于 Mod/版本不一致)
Unable to find Function ... RPC 函数在两端版本不同(热更不同步)
Login took too long 服务器 TickRate 低或登录流程同步阻塞(必须异步化)
Reliable 队列满警告 高频 Reliable RPC(见 3.2 血泪案例)

压测

上线前的对局压测:

  • 用 -server 起专用服,开 N 个 headless 客户端登录(脚本/AutomationTool 驱动)
  • 监控服务器 TickRate(目标 ≥ 30)、上行带宽、内存
  • 持续 2 小时观察有无内存泄漏(Actor 池是否回收)与 GC 抖动

心得:压测别省。我们项目上线前一周跑 8 小时满服压测,提前发现「Actor 池在玩家反复进出后缓慢泄漏」——这种问题只有长时间满负载才跑得出来,线上暴露就是事故。