性能分析器

本页面为自动翻译,可能包含错误。如果发现问题,请通过“编辑此页面”链接帮助修正。

Turian内置了引擎内性能分析器,让优化由数据驱动,而非猜测。它是游戏的分析器——测量引擎和脚本所做的工作,而非编辑器的界面——并且在Turian Studio内部和构建后的游戏中均可运行。

测量内容

  • CPU区域——每个线程上的嵌套作用域计时器。内置区域涵盖GPU场景渲染(render.scenerender.uploadrender.shadowrender.main)和脚本更新(scripts.update);你也可以添加自己的区域。
  • 渲染计数器——每帧绘制调用、三角形、顶点、纹理绑定、材质切换和已创建的纹理,直接从GPU场景渲染器收集。
  • 帧时序——每帧的挂钟CPU时间,以图表形式显示过去几秒的数据。

录制:与播放模式绑定

性能分析仅在播放模式下运行,你可以控制何时

  • ● 录制 / ❚❚ 暂停 在播放过程中开始和暂停捕获——当你只想分析运行的后半部分时非常方便。
  • 播放时自动录制(复选框)决定录制是在按下播放时立即开始,还是等你点击录制按钮。
  • 按下停止会冻结已捕获的历史记录,以便你仔细研究。

空闲的编辑器视口永远不会被测量,因此数字始终反映你的游戏。状态行(● 录制中 / ❚❚ 已暂停 / ■ 空闲)显示当前状态。

Studio面板

视图 ▸ 显示性能分析器(切换)打开。浮动面板显示:

  1. 录制传输控件、垂直同步切换和FPS上限选择器(无限制 / 30 / 60 / 90 / 120)。垂直同步独立于上限——超过显示器刷新率的上限仅在垂直同步关闭时生效。
  2. 捕获截图导出跟踪按钮(见下文)。
  3. 帧时间图表,固定在0–50毫秒范围内,带有60 fps和30 fps参考线,因此帧率的变化会直观地改变条柱高度。每个条柱分为两部分:底部的CPU忙碌部分(根据是否符合60/30 fps预算分别显示蓝/黄/红色)和顶部的空闲/上限等待部分(暗灰色)。因此,设定fps上限会产生高而大部分为灰色的条柱——条柱高度表示较低的帧率,但不会显示为红色,因为你的代码并不慢,只是在等待上限。点击或拖动图表可浏览时间线中固定的帧;最新的列(或**● 实时**)会恢复跟踪最新帧。白色标记显示固定/实时帧,历史选择器(2秒 / 4秒 / 8秒)设置可回退浏览的范围。
  4. 时间线——核心部分。每个线程是一条通道;嵌套区域按深度向下堆叠,并按帧持续时间的比例从左到右排列,类似火焰图。区域颜色在帧之间保持稳定,因此作用域在你观察时保持其颜色。时间线显示固定的帧,因此你可以回退浏览历史记录,精确检查任何帧中运行的内容。
  5. 所显示帧的**渲染(场景)**计数器。
  6. 可折叠的**编辑器CPU(工作室)**部分——编辑器自身的帧时序,被隐藏起来,以便游戏的场景指标保持在前台和中心位置。

由于渲染器在编辑器视口和发布的游戏之间共享,你在面板中看到的数字就是渲染场景的真实成本。

导出用于分析(Perfetto)

导出跟踪将记录的历史写入 <project>/profiles/trace_NNNN.json,格式为Chrome/Perfetto跟踪事件格式。在 ui.perfetto.devchrome://tracing 中打开,可以跨帧分析区域、比较帧,并使用功能齐全的工具深入研究火焰图。(Perfetto是分析端,因此无需将跟踪导入回Studio。)

截图

随时将3D视口(实际的GPU渲染场景)捕获为PNG文件——用于发现渲染故障、检查比例,以及与队友或AI助手分享帧(PNG随处可打开)。

  • 视图 ▸ 捕获截图,或性能分析器面板中的捕获截图按钮。
  • 文件保存在 <project>/screenshots/shot_NNNN.png(自动寻找下一个可用索引,不会覆盖已有截图)。面板会报告保存路径。

分析自己的代码

将脚本的任何部分包裹在作用域区域中——它将出现在时间线中:

const engine = @import("engine");

pub fn update(self: *@This(), frame: engine.Frame) void {
    var z = engine.Profiler.zone("MyScript.heavyWork");
    defer z.end();
    // ... 耗时工作 ...
}

区域自动嵌套:在另一个区域内打开的区域将成为其在火焰图中的子区域。

禁用时的开销

性能分析器在调试构建中默认开启,其他情况下关闭,因此发布的游戏无需付出任何开销,除非主动选择:

engine.Profiler.enabled = true; // 在发布构建中开启

禁用时,每个入口点通过单个分支提前返回。

构建后游戏的分析

构建后的游戏运行同样的性能分析器:生成的游戏循环在每帧使用 Profiler.beginFrame/endFrame 括起来,并记录渲染器和脚本更新区域。屏幕上的叠加HUD、帧数据导出(JSON/CSV)以及可选的 Tracy 集成已列入路线图(issue #35)。


← 所有文档 编辑此页面