跳至正文
版本:bleeding-edge 🩸

性能分析

nanos world 包含了内置的工具,用于实时分析服务器和游戏客户端的性能。在优化大型服务器、识别 Lua 瓶颈、分析帧率卡顿、调试网络问题或提高整体性能时,使用性能分析工具是必不可少的。

Tracy 性能分析器​

Tracy 帧概览

nanos world 内置了与 Tracy Profiler 的集成,允许你实时对服务器和游戏客户端进行性能分析。

Tracy 是一款实时、纳秒级分辨率的性能分析器,广泛应用于游戏开发和高性能应用程序中。它提供了一个交互式的时间轴视图,你可以在其中精确检查应用程序在每一帧期间正在执行的操作。

与传统的性能分析器不同,Tracy 允许你在游戏或服务器运行时实时检查性能。它提供了应用程序执行的详细时间轴视图,包括:

  • Lua 调用
  • 事件回调
  • 计时器回调
  • 内部系统
  • 网络处理
  • 帧时间
  • 线程活动
  • 锁竞争
  • 加载时间

悬停时的 Tracy 详细视图

下载 Tracy​

首先,从官方 Releases 页面下载 Tracy Profiler 应用程序。它必须是 0.14 版本,即 nanos world 内置的相同版本,否则将拒绝连接:

下载 Tracy Profilerhttps://github.com/wolfpld/tracy/releases

下载完成后,启动 Tracy 应用程序。

使用 Tracy 连接​

Tracy 已内置于每个服务器和游戏客户端中。在性能分析器连接之前,它保持空闲且不记录任何内容,并且只接受来自同一台机器的连接。

  1. 正常启动服务器或游戏
  2. 在同一台机器上打开 Tracy Profiler 应用程序
  3. 输入 127.0.0.1 作为地址
  4. 单击 Connect

Tracy 从连接的那一刻开始捕获,因此之前发生的任何内容(例如启动过程)都不会出现在捕获记录中。

提示

如果服务器和游戏运行在同一台机器上,先启动的那个使用端口 8086,后启动的那个使用 8087。连接到 127.0.0.1:8087 即可访问第二个。

对远程服务器进行性能分析​

由于 Tracy 只接受本地连接,请通过 SSH 转发其端口,并在你自己的机器上连接到 127.0.0.1:

ssh -L 8086:127.0.0.1:8086 user@your-server

对你的脚本进行性能分析​

每个 Lua 回调都已经会带着其来源文件和行号显示在 Tracy 中。要查看回调内部发生了什么,请使用 Debug 类的性能分析函数,它们在服务器和客户端上都可用:

Server.Subscribe("Tick", function(delta_time)
-- 将该函数作为名为“[my-package] NPC AI”的区域进行测量,也会在原生性能分析中测量
Debug.ProfileZone("NPC AI", function()
UpdateNPCs(delta_time)
end)

-- 在图表中记录一个值
Debug.ProfilePlot("NPCs Alive", #npcs)
end)

-- 在时间线上标记一个事件
Debug.ProfileMessage("Round Started")

函数返回时该区域始终会关闭,即使发生错误也是如此。其函数不接受参数也不返回任何值,因此请使用闭包来访问你的值。当 Tracy 未连接且原生性能分析关闭时,它们几乎没有开销,因此可以保留在你的代码中。使用 Debug.IsProfilerConnected() 来跳过计算仅用于供给图表的值。

注意

为区域和图表使用固定名称。每个不同的名称都会一直存储到游戏或服务器关闭,因此为每个实体构建的名称(例如 "NPC " .. id)会很快填满列表,并且超过 256 个后新名称会被忽略。

原生性能分析​

我们还集成了一个原生的性能分析命令,可用于在不使用 Tracy 的情况下捕获性能分析数据。它的工作原理是将代码中某些预定义部分的执行时间输出到服务器或客户端控制台(或客户端的性能分析 UI)。

输出性能分析信息的服务器控制台

服务器性能分析​

要启用服务器性能分析,只需使用 --profiling 命令启动服务器,或者在服务器的 Config.toml 文件中设置 profiling = true。

它将在服务器控制台中输出 PROFIL 日志,显示各种系统和 Lua 回调的执行时间。

客户端性能分析​

要启用客户端性能分析,你必须在游戏设置的调试标签页下将其启用:

游戏设置 - 调试标签页

显示帧时间​

启用此项后,它将显示一个调试 UI,其中包含:

  • 帧率(每秒帧数 - 括号内显示的是 DLSS 帧生成技术开启后的 fps)
  • 帧时间(渲染每帧所需的时间,毫秒)
  • 1% 最低帧(最差的 1% 帧的平均 fps)
  • 游戏(游戏线程花费的时间)
  • 渲染(渲染线程花费的时间)
  • rhi(RHI 线程花费的时间)
  • gpu(GPU 花费的时间)

帧时间调试 UI

在屏幕上显示性能分析​

启用此项后,它将直接在游戏屏幕上显示性能分析 UI,列出所有操作及其执行时间,允许你实时监控性能而无需查看控制台:

性能分析调试 UI

将性能分析输出到控制台​

启用此项后,将把性能分析信息输出到游戏控制台,与服务器端完全一样。

对实体和事件网络进行性能分析​

启用此项后,将在屏幕上显示每个实体的网络占用情况,以及脚本事件和其他同步网络占用情况:

实体网络统计信息调试 UI