以下是 MicroProfiler 中常見標籤的列表,按類別分組。標籤也可以互換地稱為任務、計時器、範圍、處理和標籤。無論名稱如何,它們都表示一個工作單元。
理解這些標籤可以幫助你識別遊戲中有問題的代碼。表格中包含標籤標題、描述以及改善性能和優化遊戲的建議。
睡眠
當線程不積極執行任務時,它們會進入睡眠狀態,並帶有標籤以指示線程睡眠的時間。在任何時刻,最常見的情況是大多數工作線程都處於睡眠狀態。
導航
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| rasterizeTile | 更新路徑尋找請求所需的導航瓦塊,通常隨後是需要這些瓦塊更新的 computePath。這在主線程上跟隨 NavigationJob/preprocess。 | 減少路徑尋找瓦塊的無效化次數,因為這會導致需要重新計算那些路徑。這是由於不可導航部分的移動造成的。 |
| computePath | 計算路徑,通常在 rasterizeTile 之後。 | 減少 Path:ComputeAsync() 調用的數量和範圍。如果多個代理預期從大約相似的位置開始/結束,請嘗試重用路徑。 |
| preprocess/getPrimitivesOverlapping | 收集每個路徑尋找瓦塊的世界幾何並安排光柵化任務由路徑尋找線程執行。 | 減少部分數量。 |
動畫和人形
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Simulation/gameStepped | 處理遊戲特定對象,如 Humanoids、Animations 和心跳回調。 | 請參閱下面的 gameStepped 標籤。 |
| Simulation/gameStepped/stepHumanoid | Humanoid 狀態變更和移動。 | 減少 Humanoids 的數量或在不需要的 NPC 上禁用 Humanoid 狀態,例如 Climbing 或 Swimming。減少對 Humanoid.StateChanged 的回調或狀態變更,如 Running 或 Died。 |
| Simulation/gameStepped/stepAnimation | Animators 將在當前播放的動畫中向前推進。 | 減少 Animators 或動畫關節的數量,以降低此步驟的工作負載。減少對動畫事件的回調,如 AnimationTrack.KeyframeReached 或 AnimationTrack.Ended。 |
| Simulation/gameStepped/RunService.Stepped | 運行連接到 RunService.Stepped 事件的函數。 | 減少與此事件相連的函數的數量或工作量。考慮延遲或替換昂貴的計算,或將計算分散到多幀中。 |
音頻
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Sound | 處理聲學模擬並更新正在播放的聲音。 | 請參閱下面的 Sound 標籤。 |
| Sound/stepInstances | 更新工作區中正在播放的聲音的音量。 | 減少正在播放的聲音的數量。 |
網絡
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Net PacketReceive | 接收網絡數據包。如果許多對象或事件正在複製,此步驟所需時間將會較長。 | 複製較少的對象或事件。 |
| Replicator/ProcessPackets | 處理網絡數據包的內容,例如運動、事件調用和屬性變更。 | 減少被複製的對象的數量或大小,或按增量步驟進行此操作。如果地圖大小增加,則可能會增加,因為較大的地圖往往具有更多的整體活動。 |
| Allocate Bandwidth and Run Senders/Dispatch Physics Senders and TouchSenders | 發送有關遊戲內活動的數據。 | 減少移動對象和/或觸控的數量。請參閱以下部分。 |
| Allocate Bandwidth and Run Senders/Dispatch StreamJob | 在流媒體功能中向特定客戶端發送相應的特定區域。 | 減少最小和目標流媒體半徑。 |
| Allocate Bandwidth and Run Senders/Dispatch Data Senders | 發送屬性變更、遠程事件調用、Humanoid 狀態變更、動畫狀態變更以及新實例的複製。 | 減少對數據模型的複製變更數量。 |
| Replicator SendCluster | 將 Terrain 數據發送給客戶端。 | 減少地形變更的數量或大小。 |
| ModelCompleteness Mega Job | 僅限伺服器:完整性是內部概念。當模型完全發送時,會發送模型完整性事件。 | 添加或移除較少的實例。 |
| deserializePacket | 低級網絡數據包處理。為 Replicator/ProcessPackets 做準備。 | 發送較少或較小的更新。 |
渲染
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Prepare | 從主線程收集信息並更新用於渲染的各種數據結構。 | 請參閱下面的 Prepare 標籤。 |
| Prepare/Pass3dAdorn | 處理各種對象裝飾的渲染,例如對象上方的文本標籤。對於具有遮擋的 Humanoid 標籤,此步驟包括射線投射以確定這些對象是否可見。這包括非透明部分,以促進調試可視化。 | 減少可見裝飾對象的數量,例如 BillboardGuis、Humanoid 名稱/健康標籤等。減少可見部分的數量。 |
| Prepare/Pass2d | 準備 2D UI 渲染(玩家和 Roblox UI 都包括在內)。 | 減少 UI 元素的數量或復雜性。 |
| Prepare/UpdatePrepare/updateInvalidParts | 更新一些屬性已被改變或添加的部分。 | 減少世界上的屬性變更數量。如果腳本更新大量對象屬性,請將其分解到幀中。 |
| Prepare/UpdatePrepare/updateInvalidatedFastClusters | 準備用於渲染 Humanoids 和 skinned 的 MeshParts 的“FastCluster”幾何體。標籤指定零件數、頂點數和頂點大小。 | 減少對於 Humanoids 或 skinned MeshParts 的模型的視覺變更。 |
| Prepare/UpdatePrepare/updateDynamicParts | 為渲染準備 Beams、ParticleEmitters 和 Humanoids。 | 減少可見的 Beams、ParticleEmitters 和 Humanoids 的數量。 |
| Prepare/UpdatePrepare/updateInstancedClusters | 更新使用實例化渲染的幾何體,例如部分。標籤 Clusters 和 Instances 表示更新的數量。 | 減少隱式更新部分邊界框的工作量,例如 BasePart.CFrame、BasePart.Size 或 Motor6D.Transform。創建屬性的更新,如 Bone.Transform 可以幫助。 |
| Perform | 在創建和發出實際渲染命令時。 | 請參閱下面的 Perform 標籤。 |
| Perform/fillGuiVertices | 用 UI 頂點填充緩衝區以準備渲染。gui count 標籤顯示幀中可見的 LayerCollectors 的數量。 | 如果成本很高,減少 UI 元素的數量、密度和佔用空間。如果有太多 Process GuiEffect 標籤,請考慮減少對 UIGradient 和 UICorner 在文本標籤上的使用。 |
| Perform/Scene/queryFrustumOrdered | 應用視錐體剔除,從而不渲染不可見的對象。 | 如果成本高,則意味著有許多元素。也許在某些地方使用更大的網格,因為單個網格具有更多細節,而不是許多小的獨立部分。 |
| Perform/Scene/computeLightingPerform | 計算相機附近的光照。 | 操控光源的數量或減少相機的移動,以降低重新計算光照所需的時間。 |
| Perform/Scene/computeLightingPerform/LightGridCPU | 更新體素光照,該光照在較低的質量等級中使用。 | 如果更新區塊佔用情況需要太長時間,請考慮使用較低解析度的幾何體、減少部分數量或固定部分。 如果其他標籤需要太長時間,請考慮減少光源的數量,並為移動且使佔用無效的對象使用非陰影投射幾何體。 |
| Perform/Scene/computeLightingPerform/ShadowMapSystem | 更新陰影圖。質量等級低於 4 時不執行。 | 減少光源的數量。您也可以使用 Light.Shadows 和 BasePart.CastShadow 禁用不那麼重要實例上的陰影投射。請參閱 提高性能。 |
| Perform/Scene/Glow, ColorCorrection, MSAA, SSAO, and SSAOApply | 後處理渲染。 | 減少後處理效果的數量。通常這並不重要。 |
| Perform/Scene/UI | UI 渲染。在 Id_Screen 中,有一個顯示所使用的批次、材料和三角形數量的標籤。 | 減少可見 UI 元素的數量。使用 CanvasGroups 可以幫助,但會增加內存使用。 |
| Perform/Scene/UpdateView/updateParticles, updateParticleBoundings | 更新粒子的位置和邊界。 | 減少 ParticleEmitters、發射率、生命週期等的數量。限制發射器的移動。 |
| Scene/Id_Opaque, RenderView/Id_Opaque | 場景中總透明度為 0.01 或更低的部分。 | 減少部分的使用和密度。 |
| Scene/Id_Transparent, RenderView/Id_Transparent | 場景中總透明度在 0.01 和 1 之間的部分。 | 減少部分透明度的使用。 |
| Scene/Id_Decals, RenderView/Id_Decals | 場景中的貼圖。 | 減少對複雜網格的貼圖使用。 |
| Scene/Shadows | 在場景中重新計算陰影,通常在動態場景和典型遊玩時執行。假設部件包含貼圖,不論透明度如何的部分都會投射陰影。質量等級低於 4 時不執行。 | 如果此步驟花費時間過長,請考慮對於複雜網格、高部分透明度的部件和不太重要的實例禁用 BasePart.CastShadow。完全透明的部分如果沒有貼圖或不需要貼圖陰影,應禁用 BasePart.CastShadow。請參閱 提高性能。 |
| Perform/Present | 轉發到 GPU 線程以執行渲染命令。 | 總體減少場景的複雜性。如果此步驟花費時間過長,則可能會受到 GPU 的限制。 |
| Perform/Present/waitUntilCompleted | 等待 GPU 完成渲染上一幀。 | 如果這種情況經常發生,則渲染的事物量過高。幀速率管理器幫助平衡這一點,但如果仍然過高,請嘗試遵循單獨 Scene 標籤中的性能建議。 |
| LoadImage | 將圖像處理為引擎可以使用的格式。 | 減少大型圖像的使用。 |
腳本
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Render/PreRender/fireBindToRenderSteppedCallbacks | 運行通過 RunService:BindToRenderStep() 綁定到渲染步驟的函數。 | 確保連接到此事件的函數做最少的工作。 |
| Render/PreRender/RunService.RenderStepped | 運行連接到 RunService.RenderStepped 事件的函數。 | 確保連接到此事件的函數做最少的工作。 |
| WaitingHybridScriptJob | 恢復使用 Instance:WaitForChild() 或 Globals.Roblox.wait() 等待的腳本。通常每秒執行 30 次。此步驟有一個執行時間預算,以運行等待的腳本。 | 如果有太多等待的腳本或有長執行時間的腳本在等待中,則此步驟會受到限制,並在再次運行之前等待更長時間。減少此步驟中的綁定函數或長計算的數量。 |
| GC | Luau 的垃圾回收周期。 | 池化表格和其他可收集的對象,或嘗試減少創建臨時表格。 |
| Heartbeat/RunService.Heartbeat | 運行連接到 RunService.Heartbeat 事件的函數。 | 減少與此事件相連的函數的數量或工作量。考慮延遲或替換昂貴的計算,或將計算分散到多幀中。 |
模擬
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Distributed Physics Ownership | 確定服務器或客戶端是否擁有某些實例的權限,例如部分。 | 減少頻繁切換網絡擁有權的部件數量,特別是那些常見互動的部件。 |
| Simulation/assemble | 更新物理引擎使用的物體連接樹(組合)。 | 減少創建或銷燬的關節數量。 |
| Simulation/physicsSteppedTotal/physicsStepped | 運行物理模擬。 | 減少物理模擬物體的數量和複雜性。 |
| Simulation/physicsSteppedTotal/physicsStepped/SpatialFilter/filterStep | 更新模擬島,根據網絡擁有權和本地模擬排列部分。島是不互動的部分組,可以獨立模擬。 | 避免頻繁設置網絡擁有權。保持部分組隔得足夠遠,以便可以獨立模擬。 |
| Simulation/physicsSteppedTotal/physicsStepped/worldStep/stepContacts | 更新對象之間的接觸。 | 減少同時碰撞的物體數量,或使用更簡單的碰撞框。立方體比複雜網格更好。 |
| Simulation/physicsSteppedTotal/physicsStepped/worldStep/stepWorld 或 stepWorldThrottled | 解決與連接器、浮力和 Humanoids 相關的物理方程。當引擎過載並無法實時模擬所有內容時,某些步驟可能會受到限制(stepWorldThrottled),僅模擬“實時組合”,例如 Humanoids。 | 取決於接下來三個階段的時間分配:stepContacts: 窄相位碰撞檢測幾何測試。解決者步驟: 整合時間並解決碰撞及其他約束 updateBroadphase: 更新碰撞檢測系統中組合的位置,並找到可能發生碰撞的窄相位對。 |
| notifyMovingAssemblies | 幫助跟蹤原始物體睡眠的時間。 | |
| Simulation/physicsSteppedTotal/physicsStepped/interpolateNetworkedAssemblies | 插值未被當前玩家控制的組合。 | 將部分的網絡擁有權設置為當前玩家以減少此步驟;儘管這通常會導致在其他地方需要更多的物理工作。 |
| Simulation/handleFallenParts | 移除已掉落到 Workspace.FallenPartsDestroyHeight 以下的部分。 | 降低破壞高度或減少掉到破壞高度的部分數量。 |
| Heartbeat/heartbeatInternal/workspaceOnHeartbeat/updateVisuallySleeping | notifyMovingAssemblies 的第二部分。 | |
| Heartbeat/RunService.Heartbeat | 運行連接到 RunService.Heartbeat 事件的函數,以模擬和腳本接觸。當前描述足夠通用,不會錯誤。 | 減少與 RunService.Heartbeat 相關的函數的數量或工作量。 |
| worldStep/stepContacts | 幫助物理模擬同時步進多個接觸。 | 減少碰撞物體的數量。 |
| SolveBatch | 幫助物理模擬解決物體的運動批次。 |
UI
| 標籤 | 描述 | 性能建議 |
|---|---|---|
| Render/PreRender/UpdateInput | 更新並觸發所有用戶輸入相關事件,如果用戶自上次幀以來執行了輸入。 | 嘗試在獲取輸入時不要執行過多的工作。考慮對輸入進行最少量的處理,較大的計算則應推遲到稍後的另一個線程上輸入完成後進行。 |
| Render/PreRender/TweenService | 使用 TweenService 更新正被插值的對象並調用完成回調,例如那些提供給 GuiObject:TweenSize() 或 GuiObject:TweenPosition() 的。 | 減少使用 TweenService 的被插值對象數量,並確保回調做最少的工作。 |
| Heartbeat/TweenService | 在伺服器上,TweenService 在 RunService.Heartbeat 中運行,而不是 RunService.PreRender。 | 減少使用 TweenService 的被插值對象數量,並確保回調做最少的工作。 |
| Render/PreRender/UpdateUILayouts | 更新所有啟用的 LayerCollectors 上的 UI 元素的位置和大小。 | 請參閱下面的 UpdateUILayouts 標籤。 |
| Render/PreRender/UpdateUILayouts/Rebuild Z-order list | 對 UI 元素的 Z 順序進行排序(內部術語,不要與 GuiObject.ZIndex 混淆),以防止 UI 元素重疊。 | 減少具有相同 GuiObject.ZIndex 的 UI 元素的數量。 |
| Render/PreRender/UpdateUILayouts/Layout | 更新單個 LayerCollector 中的 UI 元素的位置和大小。可以包含有關相關 UI 的信息的標籤,及重新布局、更新和尺寸調整的數量。 | 減少被調整大小或重新定位的 UI 元素的數量,例如那些由 UILayout 管理的,以及使用 TweenService、GuiObject:TweenSize() 或 GuiObject:TweenPosition() 的那些。考慮為 BillboardGuis 使用固定大小。 |