脚本分析器 是一个 开发者控制器 中的工具,可以记录所有运行的脚本的 profiling 会话,并且使用自定义记录设置查看其 CPU 时间花费。它可以记录所有类型的函数调用,包括 Luau 函数、方法调用和属性访问。此工具有助于识别占用最多 CPU 资源并导致性能放缓的脚本。
录制 profiling 会话
在录制之前,您需要选择录制环境从:
- 客户端 (默认) — 记录客户端脚本,包括 LocalScripts 和 Scripts 使用 0> Class.BaseScript.RunContext|RunContext0> 设置为 3> Enum.RunContext.Client|Client 3> .
- 服务器 — 记录服务器端脚本,包括 Scripts 使用 RunContext 设置为 0> Enum.RunContext.Server|Server0> 或 3> Enum.RunContext.Legacy|Legacy 3>。脚本调查器在每个会话结束时
您还可以设置以下录制选项:
行为 | 选项 | 默认 | 描述 |
---|---|---|---|
频率 | 1000 每秒 (1 KHz)10,000 每秒 (10 KHz) | 1 兆兆 | 10 KHz 频率的编程可能会更精确地检测到 API 调用,但也有可能会导致性能成本更高。 |
会话长度 | 1分钟5分钟10分钟手册 | 手动 | 手动选项需要您手动停止录制。 |
实时投票行为 | 开关 | 关 | 此行为在每次进行 profiling 时每秒钟更新和刷新 profiling 数据。 |
要记录新的 profiling 会话:
打开开发者控制器。
扩展工具下拉列表选择 ScriptProfiler 。
扩展客户端-服务器下拉列表,选择 客户端 或 服务器 。
(可选) 检查 实时 选项卡启用实时调查行为。
(可选) 选择 Freq 和 Time 来选择录制频率和会话时间长度,如果您不想使用默认值。
单击 开始 以开始 profiling 会话。如果您设置了持续时间,Script Profiler 会显示剩余时间在会话中。
单击 停止 或等待录像完成显示 profiling 数据。
阅读个人资料
在会话结束后,脚本调试器生成一个表,显示每个函数的调用成本在 CPU 时间。表按照从最多时间花费到最少时间花费的顺序排序函数调用,允许您按名称搜索特定函数。它提供以下两种视图:
- 调用图 (默认): 根据框架任务类别来分类和显示函数调用。 此视图显示每个任务类别为树层结构下的节点,允许您扩展它们以查看函数。 您还可以将鼠标悬停在任何树层上以查看文件和行信息。 例如, Stepped/CameraInput
- 函数 : 列出所有函数,无需按任务分类。
您还可以从以下显示选项中选择来定制您的调试需求:
名称 | 选项 | 默认 | 描述 |
---|---|---|---|
单位 | 毫秒 (ms)百分比 (%) | 毫秒 | 显示 API 调用在总记录会话中的时间(以百万秒或百分比)。 |
平均 | 关闭1-秒1-分钟5-分钟10-分钟 | 关 | 根据选定的值计算每个 API 调用的平均时间。如果您选择了一个超过会话长度的选项,脚本 profiler 会使用会话长度进行估算。例如,您可以选择 5 分钟的选项为 1 分钟的会话计算平均值。 |
导出数据
脚本调试器允许您将记录的数据导出为 JSON 文件。要在 profiling 会话后导出记录的数据:
在脚本分析器窗口中,单击 导出 。
在导出窗口中,选择您想要导出的 profiling 会话。如果您想要设置自定义名称,请重命名默认文件名。
单击 导出 保存JSON文件。
导出的 JSON 文件包括以下字段:
- 版本 : 版本号。
- sessionStartTime : 一个时间在毫秒级别上记录会话开始时间的时戳。
- sessionEndTime : 一个时间在毫秒级记录会话结束时间的时戳。
- 类别 : 记录在 profiling 会话中的框架任务类别。 每个入口包括:
- 名称 : 每个框架任务类别的名称。
- NodeId : 任务类别的独特标识(节点)。它是一个 1 基索引到 Nodes 数组列。例如,您可以使用 NodeId 中的 123 元素来查找节点。
- 节点 : 在 profiling 会话中记录的阵列。 每个入口包括:
- 总持续时间 : 节点在微秒级时间内所需的 CPU 时间。
- FunctionIds :函数的独特标识。
- NodeIds :一个集合节点ID的阵列。
- 函数) : 在 profiling 会话中记录的函数阵列。
- 总持续时间 : 函数在微秒级时间内所需的时间。
- 名称 : 函数的名称,如果可用。
- 源 : 函数的源,如果可用。
- 线路 : 函数的线路号,如果可用。
- 旗帜 :代表任何特定函数执行环境的 bit 字段。目前可以有以下值:
- 0 : 第 0 位代表 IsNative 在原始代码生成器下的执行。
- 1 : 第 1 位代表 IsPlugin 作为插件的执行部分。
示例导出的个人资料
{
"Version":2,
"SessionStartTime":1704850750514,
"SessionEndTime":1704850751198,
"Categories":
[
{"Name":"Parallel Luau","NodeId":4},
{"Name":"Heartbeat","NodeId":1}
],
"Nodes":
[
{"TotalDuration":2530,"FunctionIds":[1],"NodeIds":[2]},
{"TotalDuration":2530,"FunctionIds":[2,5],"NodeIds":[3,7]},
{"TotalDuration":1267},
{"TotalDuration":7746,"FunctionIds":[3],"NodeIds":[5]},
{"TotalDuration":7746,"FunctionIds":[4],"NodeIds":[6]},
{"TotalDuration":7746},
{"TotalDuration":1263,"FunctionIds":[6],"NodeIds":[8]},
{"TotalDuration":1263,"FunctionIds":[7],"NodeIds":[9]},
{"TotalDuration":1263,"FunctionIds":[8],"NodeIds":[10]},
{"TotalDuration":1263}
],
"Functions":
[
{"Name":"main","TotalDuration":2530},
{"Source":"builtin_ManageCollaborators.rbxm.ManageCollaborators.Packages._Index.roblox_rodux-3.0.0.rodux.Store","Line":81,"TotalDuration":1267},
{"Name":"Script","TotalDuration":7746},
{"Source":"Workspace.Actor.Script","Line":1,"TotalDuration":7746},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Line":221,"TotalDuration":1263},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Name":"_update","Line":236,"TotalDuration":1263},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Name":"_getRange","Line":277,"TotalDuration":1263},
{"Source":"[C]","Name":"ScrollingFrame.CanvasPosition","TotalDuration":1263}
]
}