腳本分析器是內建於開發者控制台中的一個工具,允許您記錄所有正在運行的腳本的分析會話,並以自定義的錄製和顯示設置查看它們的 CPU 時間成本。它可以記錄所有類型的函數調用,包括 Luau 函數、方法調用和屬性訪問。這個工具對於識別佔用最多 CPU 資源、減慢性能的腳本非常有幫助。
記錄分析會話
在記錄之前,您需要從以下選項中選擇錄製環境:
您還可以設置以下錄製選項:
| 行為 | 選項 | 默認 | 說明 |
|---|---|---|---|
| 頻率 | 每秒 1000 次(1 KHz) 每秒 10,000 次(10 KHz) | 1 KHz | 10 KHz 的頻率具有更高的精確度,因為腳本分析器可能無法記錄頻率高於您所選頻率的 API 調用,但其性能開銷也更高。 |
| 會話長度 | 1 分鐘 5 分鐘 10 分鐘 手動 | 手動 | 手動選項需要您手動停止錄製。 |
| 實時輪詢行為 | 開 關 | 關 | 此行為在分析會話中每秒輪詢和刷新分析數據。 |
要記錄新的分析會話:
打開開發者控制台。
展開工具下拉選單選擇腳本分析器。

展開客戶端-伺服器下拉選單選擇客戶端或伺服器。

(可選)勾選實時復選框以啟用實時輪詢行為。
(可選)選擇頻率和時間以選擇錄製頻率和會話時間長度,如果您不想使用默認值。
點擊開始以開始分析會話。如果您設置了持續時間,腳本分析器會顯示一個倒計時計時器,顯示會話中剩餘的時間。
點擊停止,或等待錄製完成以顯示分析數據。
閱讀分析數據
會話停止後,腳本分析器生成一個表格,顯示每個函數調用在 CPU 時間上花費的時間。該表格將函數調用按照花費時間從多到少進行排序,並允許您按名稱搜索特定的函數。它提供以下兩種視圖:
- 調用圖(默認):根據框架任務對函數調用進行分類,並以樹狀結構顯示。此視圖將每個任務類別顯示為同一根下的節點,並允許您展開它們以查看函數。您還可以將鼠標懸停在樹中的任何節點上以查看文件和行號信息。例如,Stepped/CameraInput/<anonymous> 可能會顯示 Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125。

- 函數:列出所有函數,而不根據任務對其進行分類。

您還可以從以下顯示選項中進行選擇,以滿足您的調試需求:
| 名稱 | 選項 | 默認 | 說明 |
|---|---|---|---|
| 單位 | 毫秒(ms) 百分比(%) | ms | 以毫秒或錄製會話總時間的百分比顯示每個 API 調用所花費的時間。 |
| 平均值 | 關 1 秒 1 分鐘 5 分鐘 10 分鐘 | 關 | 根據所選值計算每個 API 調用的平均花費時間。如果您選擇的選項長於會話長度,腳本分析器將推斷會話長度來計算平均值。例如,您可以為 1 分鐘的會話選擇 5 分鐘的選項,以查看如果您運行該代碼 5 分鐘,預期的平均值。 |
導出分析數據
腳本分析器允許您將錄製的分析數據導出為 JSON 文件。要在分析會話後導出錄製的數據:
在腳本分析器窗口上,單擊導出。
在導出窗口中,選擇您要導出的分析會話。如果需要設置自定義名稱,請重新命名默認文件名。
單擊導出以保存 JSON 文件。

導出的 JSON 文件包括以下字段:
- Version: 版本號。
- SessionStartTime: 以毫秒為單位的時間戳,記錄會話開始時間。
- SessionEndTime: 以毫秒為單位的時間戳,記錄會話結束時間。
- Categories: 在分析會話中記錄的框架任務類別的數組。每個條目包括:
- Name: 每個框架任務類別的名稱。
- NodeId: 任務類別的唯一標識符(節點)。它是Nodes數組中的 1 基索引。例如,您可以通過檢索 Nodes 中的第 123 個元素查找 NodeId 為 123 的節點。
- Nodes: 在分析會話中記錄的節點數組。每個條目包括:
- TotalDuration: 該節點在 CPU 時間上的成本,以微秒為單位。
- FunctionIds: 函數的唯一標識符數組。
- NodeIds: 節點 ID 的數組。
- Functions: 在分析會話中記錄的函數數組。
- TotalDuration: 該函數在 CPU 時間上的成本,以微秒為單位。
- Name: 函數的名稱(如果可用)。
- Source: 函數的來源(如果可用)。
- Line: 函數的行號(如果可用)。
- Flags: 一個位域,指示任何特定的函數執行環境。目前可以具有以下值:
- 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}
]
}