以下是 MicroProfiler 中常见标签的列表,按类别分组。标签也可以交替称为任务、计时器、范围、进程和标签。无论名称如何,它们都代表一个工作的单位。
了解这些标签可以帮助你识别游戏中存在的问题代码。表中包含标签名称、描述以及改善性能和优化游戏的建议。
睡眠
当线程未积极执行任务时,它们进入睡眠状态,并带有指示线程处于睡眠状态的标签。在任何给定时刻,大多数工作线程处于睡眠状态是非常常见的。
导航
| 标签 | 描述 | 性能建议 |
|---|---|---|
| rasterizeTile | 更新路径finding请求所需的导航瓷砖,通常接着是需要这些瓷砖是最新的 computePath。在主线程上跟随 NavigationJob/preprocess。 | 减少路径finding瓷砖失效的数量,因为这会导致需要重新计算这些路径。这是由于不可导航部分的移动引起的。 |
| computePath | 计算路径,通常在 rasterizeTile 之后。 | 减少 Path:ComputeAsync() 调用的数量和世界范围。如果多个代理预计从大致相似的位置开始/结束,尝试重用路径。 |
| preprocess/getPrimitivesOverlapping | 收集每个路径finding瓷砖的世界几何体,并安排由路径finding线程执行的光栅化任务。 | 减少部分的数量。 |
动画与人形
| 标签 | 描述 | 性能建议 |
|---|---|---|
| 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 和 绑定 的 MeshParts 的 "FastCluster" 几何体。标签指定了部件、顶点的数量和顶点的大小。 | 减少对具有 Humanoids 或绑定的 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 OR stepWorldThrottled | 解决与连接器、浮力和 Humanoids 相关的物理方程。当引擎超负荷且无法实时模拟所有内容时,某些步骤可能会被限制(stepWorldThrottled),仅模拟“实时组件”,如 Humanoids。 | 取决于时间的去向,依据以下三个阶段:stepContacts:窄相位碰撞检测几何体测试。Solver step:整合时间并解决碰撞和其他约束 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 | 帮助物理模拟解决一批对象的运动。 |
用户界面
| 标签 | 描述 | 性能建议 |
|---|---|---|
| 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 使用固定大小。 |