腳本偵測器是開發者控制台內的工具,可讓您記錄所有運行的腳本的偵測會話,並查看其CPU時間費用以及使用自訂記錄和顯示設定。它可以記錄所有類型的功能呼叫,包括 Luau 功能、方法呼叫和屬性訪問。這個工具有助於識別佔用最多 CPU 資源並降低性履約的腳本。
記錄個人化會話
在錄製之前,您需要從以下選擇錄製環境:
- 伺服器 — 記錄服務器側腳本,包括 設為 或 。腳本偵測器在每個會作業結束時清除所有收集的服務器端資料。
您也可以設定以下記錄選項:
行為 | 選項 | 預設 | 說明 |
---|---|---|---|
頻率 | 每秒 1000 次 (1 KHz)10,000 次每秒 (10 KHz) | 1 KHz | 10 KHz 頻率的精度更高,因為腳本偵測器可能不會捕捉到比選擇的頻率更頻繁地執行的 API 呼叫,但也有更高的性能成本。 |
會話長度 | 1 分鐘5 分鐘10 分鐘手動 | 手動 | 手動選項需要您手動停止錄製。 |
實時投票行為 | 開啟關閉 | 關閉 | 此行為每秒在進行分析期間會檢查和刷新分析作業料。 |
要記錄新的分析會作業:
開啟 開發者控制台。
擴展工具下拉選單以選擇 腳本檢查器 。
擴展客戶端與伺服器下拉選單以選擇 客戶端 或 伺服器 。
(可選) 檢查 實時 檢查框以啟用實時投票行為。
(可選) 選擇 頻率 和 時間 來選擇記錄頻率和會話時間長度,如果你不想使用預設值。
點擊 開始 開始分析會作業。如果您設定時間長度,腳本偵測器會顯示剩餘時間在會作業中的倒數計時器。
點擊 停止 或等待記錄結束以顯示調試數據。
閱讀個人化資料
會話停止後,腳本偵測器會生成一個表,顯示每個功能呼叫的 CPU 時間成本。表排序功能從最多使用時間到最少使用時間排序,並允許您按名稱搜尋特定功能。它提供以下兩個視圖:
- 呼叫圖 (預設):依據框架任務將功能呼叫分類和顯示到樹狀結構。這個觀點會將每個任務類別顯示為同一根樹下的節點,並允許您擴展它們以查看功能。您也可以將鼠標懸停在樹中的任何節點上,查看文件和行信息。例如, 步驟/攝影機輸入/<anonymous> 可能會揭露Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125。
- 功能 :列出所有功能,不依據任務進行分類。
您也可以從以下顯示選項中選擇,以調整您的偵錯需求:
名稱 | 選項 | 預設 | 說明 |
---|---|---|---|
單位 | 毫秒 (ms)百分比 (%) | ms | 顯示每次API呼叫所花費的時間以毫秒或總錄音會作業百分比來顯示。 |
平均 | 關閉1-秒1-分5-分10-分 | 關閉 | 計算選擇的值在每次API呼叫上的平均時間。如果您選擇超過會話長度的選項,腳本偵錯器會將會話長度延伸到計算平均值。例如,您可以選擇 5 分鐘選項來查看 1 分鐘會話的預期平均值,如果您執行代碼 5 分鐘。 |
匯出個人化資料
腳本偵測允許您將記錄的偵測資料匯出為 JSON 檔案。要在偵測會作業後匯出記錄資料:
在腳本調試器窗口上,單擊 匯出 。
在匯出窗口,選擇你想要匯出的調試會話。如果你想設置自定名稱,請重命名預設文件名稱。
點擊 匯出 以保存 JSON 文件。
匯出的 JSON 檔案包含以下欄位:
- 版本 :版本號碼。
- 會話開始時間 : 以毫秒為單位的時戳,記錄會話開始時間。
- 會話結束時間 : 以毫秒為單位的時戳,記錄會話結束時間。
- 類別 : 在調試會話記錄的框架任作業類別的一個數組。每個入口包括:
- 名稱 :每個框架任務類別的名稱。
- 節點ID :任務類別(節點)的唯一標識符。它是 Nodes 陣列中的 1 基指數。例如,您可以使用 在 中找到節點的 123 個元素來查找 的節點。
- 節點 :記錄在調試會作業中的節點數組。每個入口包括:
- 總持續時間 :節點在微秒內花費的 CPU 時間量。
- 功能ID :一個包含功能獨特標識符的數陣。
- 節點ID :一個節點ID列表。
- 功能 : 一個在調試會作業記錄的功能陣列。
- 總持續時間 :功能在微秒內的 CPU 時間成本的數量。
- 名稱 :如果可用,則為函數的名稱。
- 來源 :如果可用的話,函數的來源。
- 線 :如果可用,函數的線號。
- 旗幟 : 一個指示特定功能執行環境的位元字段。目前可以有以下值:
- 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}
]
}