腳本分析器是開發者控制台中的一個工具,允許您記錄所有運行中的腳本的分析會話,並查看它們的 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 文件包括以下字段:
- 版本:版本號。
- SessionStartTime:以毫秒為單位的時間戳,記錄會話開始時間。
- SessionEndTime:以毫秒為單位的時間戳,記錄會話結束時間。
- Categories:在分析會話中記錄的幀任務類別的數組。每個條目包括:
- 名稱:每個幀任務類別的名稱。
- 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}
]
}