以下是 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 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 | 帮助物理模拟解决一批对象的运动。 |
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 | 在第一次渲染时或当添加、删除或更改 GuiObject.ZIndex 时,重建 LayerCollector 中 UI 元素的内部 Z-order 列表(不要与 GuiObject.ZIndex 混淆)。 | 在第一次渲染之前减少 LayerCollectors 中的 UI 元素数量,并避免频繁更改 UI 元素的父级和 GuiObject.ZIndex。LayerCollector 中的元素越多,性能越差。 |
| Render/PreRender/UpdateUILayouts/Layout | 更新单个 LayerCollector 中 UI 元素的位置和大小。可以包含有关相关 UI 的信息的标签,以及 Relayouts、Updates 和 Resizes 的数量。 | 减少被调整大小或重新定位的 UI 元素的数量,例如由 UILayout 管理的元素和使用 TweenService、GuiObject:TweenSize() 或 GuiObject:TweenPosition() 进行补间的元素。考虑为 BillboardGuis 使用固定大小。 |