引擎统计信息
Author: Charley
引擎的统计信息面板,本质是一套实时、可视化的性能与资源观测工具。它把引擎运行时最关键的性能数据(FPS、Frame Time、各阶段耗时、DrawCall、几何量、GPU 显存、加载与脚本等)持续呈现在屏幕上,目的是:
把“感觉卡”变成“能定位、能对比、能验证的数字”。
它是性能调试的第一现场:用于快速判断瓶颈方向、指导优化决策,并验证每一次修改是否真的有效。
本篇将完整的介绍 IDE 中引擎统计信息的每一个可设置参数的作用。
1. 统计信息的显示开启/关闭
Section titled “1. 统计信息的显示开启/关闭”1.1 统计面板的开启与关闭
Section titled “1.1 统计面板的开启与关闭”统计信息面板通常用于 IDE 开发与调试阶段。通常,开发者只需在 IDE 面板中勾选 “显示统计信息” 选项,即可开启统计面板,如图 1-1 所示。

(图1-1)
统计信息面板开启后,会在运行过程中持续显示并实时刷新当前选中的统计项数据。
在某些场景下,开发者可能希望在代码中,或通过 DevTools 控制台 动态控制统计信息面板的显示状态。此时可以直接调用引擎提供的 API。
- 开启统计面板
调用
Laya.Stat.show()后,统计面板会显示在屏幕上,并按照当前配置的统计项进行刷新显示。 - 关闭统计面板
调用
Laya.Stat.hide()后,统计面板将停止刷新,并从屏幕中移除。
统计信息面板的刷新频率为 每帧一次,用于实时反映当前帧的性能与资源状态。
1.2 统计项的开启与关闭
Section titled “1.2 统计项的开启与关闭”如果默认显示的统计信息无法满足开发需求,开发者可以在 IDE 的统计配置面板 中,通过勾选或取消勾选的方式,自定义需要显示的统计项,如图 1-2 所示。

(图1-2)
除了 IDE 面板配置外,统计信息面板也支持通过代码进行精确控制。开发者可以通过设置Laya.Stat.elements,指定需要显示的统计项集合。
示例代码如下:
const { regClass, property } = Laya;
@regClass()export class Demo extends Laya.Script { onEnable(): void { Laya.Stat.elements = [ Laya.StatElement.CT_FPS, Laya.StatElement.CT_DrawCall, Laya.StatElement.M_GPUMemory ]; // 开启统计面板(参数为x,y坐标,默认为0,0) Laya.Stat.show(5, 5);
// 关闭示例: // Laya.Stat.hide(); }}通过代码方式配置统计面板,适合以下场景:
- 仅在特定调试阶段显示统计信息
- 根据运行状态动态切换统计项
- 在不同设备或模式下使用不同的统计配置
1.3 统计项的前缀标识
Section titled “1.3 统计项的前缀标识”在引擎中,依据统计项名称前缀进行区分不同的统计类型,具体如下:
以 T_ 开头:时间类统计项,单位为 毫秒(ms)
以 M_ 开头:内存类统计项,单位为 MB
以 C_ / CT_ 开头:数量或次数统计项,显示为 整数(无小数)
尽管在 IDE 的统计信息配置项中,并不会显示这些前缀,仅仅是为了可读性更好,在引擎与项目的实际使用中,一定要注意,是存在统计项前缀的。
2. FPS(CT_FPS)
Section titled “2. FPS(CT_FPS)”FPS(Frames Per Second,每秒帧数)用于表示 当前设备在运行过程中,每秒能够完成的渲染帧数,它直接反映了游戏整体运行是否流畅。
在多数项目中,FPS 往往是新人最先关注、同时也是最容易被误解的统计指标,因此在实际分析中,需要配合 Frame Time 以及各模块耗时一起解读,而不建议单独作为性能判断依据。
2.1 FPS 的意义与应用
Section titled “2.1 FPS 的意义与应用”FPS 的主要作用有两方面。首先,它是判断游戏是否流畅的第一信号。一般来说,60FPS 被视为完全流畅,而低于 20FPS 时,玩家的主观体验会明显下降。其次,FPS 可作为性能回归的对比基线。在相同场景、机型和操作路径下,如果新功能引入后 FPS 下降,就能快速判断是否存在性能回退。
在开发阶段,FPS 常用于快速自检。比如在添加 AI、物理、特效或后处理系统后,可以先观察 FPS 是否下降,再结合统计面板分析具体的性能压力来源。在机型适配和性能档位调整中,低端机 FPS 偏低时,开发者可以通过统计面板决定优化策略,包括降低阴影分辨率、减少粒子数量、降低贴图精度或关闭部分后处理效果。
需要强调的是,FPS 仅是性能结果,而不是原因。当 FPS 下降时,应联动查看其他关键指标:
- 帧时间 (
T_Frame_Time):是否超过目标阈值(如 >16ms 对应 60FPS,>33ms 对应 30FPS)。 - 脚本更新耗时 (
T_ScriptUpdateTime):判断脚本逻辑是否过重。 - 阴影和渲染开销 (
T_ShadowPass/CT_ShadowDrawCall):分析阴影计算压力。 - 资源占用 (
M_AllTexture/M_GPUMemory):检查显存或资源占用是否影响性能。
初步优化可从以下方向入手:DrawCall 偏高时优先合批、减少材质与贴图切换及 UI 节点碎片化;阴影开销大时可减少投射对象、降低分辨率或更新频率;脚本逻辑复杂时拆分或降低更新频率,并使用缓存和对象池优化。
2.2 性能调试总览
Section titled “2.2 性能调试总览”为了让统计面板真正指导性能优化,可以遵循一个清晰的流程:先判断瓶颈大类 → 再定位具体阶段 → 最后验证优化效果。
首先,应明确目标帧率(常见为 60FPS 或 30FPS)并固定复现条件,包括机型、场景、视角和操作路径。只有在一致条件下,FPS 与 Frame Time 的对比才有参考价值,其中 FPS 显示整体结果,而 Frame Time 更适合判断是否达标。
接下来进行快速分流,判断性能压力主要来源于 CPU 还是渲染。一般流程如下:
- 脚本开销:检查
T_ScriptUpdateTime/T_ScriptLateUpdateTime,如果明显偏高,则 CPU 脚本逻辑是主要瓶颈。 - 2D 渲染开销:观察
T_AllRender2D和CT_2DDrawCall,常见于 UI 过复杂或节点碎片化严重。 - 3D 渲染开销:查看
T_AllRender3D以及T_ShadowPass、T_DepthPass、T_3DMainPass_*指标,分析渲染压力来源。
在定位原因时,建议使用配套指标综合判断。
耗时高的指标(T_)可配合次数或规模指标(CT_ / C_)分析,例如 T_3DMainPass_Opaque 偏高时,可查看 CT_OpaqueDrawCall、CT_ShaderChange 或 CT_Triangle。
资源占用高(M_)时,也应参考数量指标(C_),如 M_AllTexture 高时,查看 C_AllTexture 与 M_RenderTexture。对于加载或网络相关问题,可通过 T_LoadRequestTime 与 T_LoadResourceTime 对比,区分下载慢或解析慢。
最后,每次优化后必须验证效果。重点关注三方面:核心指标是否改善(目标 T_ / CT_ 是否下降)、整体性能是否提升且稳定(FPS 与 Frame Time 是否改善)、是否引入副作用(画质是否可接受,其他性能指标是否异常,如 DrawCall 降低但三角形数量暴增或显存飙升)。
3. Module Time(模块耗时)
Section titled “3. Module Time(模块耗时)”在 IDE 中,Module Time 为分组标题,用于把“时间类统计项(T_)”集中展示。此分组内的值主要由 LayaGL.statAgent.recordTimeData(...) 写入。
使用指南
- 先看总体:先看
FPS与T_Frame_Time,确认“是否真的卡”(FrameTime 是否明显 > 16ms/33ms)。 - 再找大头:对比
T_ScriptUpdateTime、T_AllRender3D、T_AllRender2D、T_ShadowPass、T_Render_PostProcess,找出占用最大的模块。 - 最后下钻:在 3D 内部再看
T_CullMain、T_DepthPass、T_3DMainPass_*、T_3DContext*,逐步缩小到具体阶段。
调试与优化速查表
使用方式:先找到“最高/最异常”的
T_项,再按表中的“常见原因 → 优先优化建议”执行;优化后用T_Frame_Time与对应T_项做回归验证。
| 指标 | 异常信号(经验判断) | 常见原因(从高概率到低概率) | 优先优化建议(建议按顺序做) |
|---|---|---|---|
T_Frame_Time | 长期高于目标(>16ms/33ms)或波动大 | 任何模块耗时超标;偶发尖峰可能是资源创建/编译/GC | 先用本章其它 T_ 找“大头”;再看 CT_*/C_*/M_* 配套指标;对尖峰优先排查资源创建与首编译 |
T_AllRender3D | 3D 总耗时明显大于 2D/脚本 | 3D 主流程重(主渲染/阴影/深度/透明/材质复杂) | 先拆分看 T_ShadowPass/T_DepthPass/T_3DMainPass_*;再用 CT_*DrawCall/CT_ShaderChange/CT_Triangle 找根因 |
T_DepthPass | 开启后处理/深度后明显升高 | Depth/DepthNormals 额外绘制;参与对象过多 | 降低依赖深度的效果质量/数量;减少参与对象;检查是否不必要地开启 DepthNormals |
T_ShadowPass | 开阴影后显著升高 | 阴影分辨率高、级联多、投射对象多、更新频率高 | 优先减少投射阴影对象;降低阴影分辨率/级联;降低阴影更新频率;必要时关阴影或改成烘焙 |
T_3DMainPass | 主渲染阶段很高 | 不透明/透明绘制重、材质复杂、光照复杂 | 先看 T_3DMainPass_Opaque/Trans 分摊;再降 DrawCall/ShaderChange/三角形;减少透明过绘制 |
T_3DContextPre | “准备阶段”很高 | shader 首次编译、频繁 define/状态变化、UBO/资源更新频繁 | 预热 shader;减少每帧动态改材质/宏定义;减少频繁创建/销毁资源;降低 UBO 上传(见 CT_UBO*) |
T_3DContextRender | “绘制阶段”很高 | DrawCall 多、三角形多、透明过绘制、状态切换多 | 先降 CT_DrawCall/CT_3DDrawCall;再降 CT_Triangle;再降 CT_ShaderChange;减少全屏透明/粒子 |
T_3DMainPass_Opaque | 不透明耗时占比最高 | 不透明对象多、材质碎、光照复杂 | 合批/实例化/静态合并;减少材质种类;优化灯光与阴影参与;LOD/裁剪 |
T_3DMainPass_Trans | 透明耗时异常高 | 透明对象/粒子多、排序与过绘制严重 | 减少透明数量与覆盖面积;合并特效;尽量避免大面积半透明叠加;优先优化粒子 |
T_3DBatchTime | 合批耗时高但 DrawCall 降不明显 | 场景对象极多、合批策略不匹配、动态变化频繁 | 先确认合批是否带来 DrawCall 收益;无收益时减少参与/改策略;降低动态变更频率 |
T_CullMain | 场景对象一多就升高 | 3D 节点/渲染器数量大,裁剪/剔除成本上升 | 降低同屏对象数量;启用/优化裁剪策略;尽量减少不可见但仍参与列表的对象 |
T_CullShadow | 阴影开启后裁剪就很贵 | 投射阴影对象过多、级联/多光源导致重复裁剪 | 减少投射对象;降低阴影范围;降低级联/光源数量;提高过滤条件 |
T_Render_PostProcess | 开后处理后明显升高 | 后处理链过长/效果重/分辨率高 | 关闭或降低重效果;降低后处理分辨率;减少叠加效果数量 |
T_AllRender2D | UI/2D 场景下显著升高 | UI 节点碎、mask/滤镜多、频繁重建 | 先看 CT_2DDrawCall;减少 mask/滤镜;做列表虚拟化;减少每帧布局/文字重建 |
T_2DPass | 多 Pass 时升高 | Pass 数量多、离屏/后处理多 | 减少 Pass;合并效果;降低离屏 RT 分辨率 |
T_2DContextPre | 2D 准备阶段高 | 2D 元素准备/数据上传重 | 减少动态变化;缓存/复用;降低几何重建 |
T_2DContextRender | 2D 绘制阶段高 | DrawCall 多、透明叠加、过绘制 | 降 CT_2DDrawCall;合图集;减少层级与透明覆盖 |
T_ScriptUpdateTime | 每帧脚本耗时高 | 逻辑重、遍历大、频繁分配/GC、事件过多 | 优先减少每帧分配;拆分重逻辑/降频;缓存查找结果;对象池;减少全量遍历 |
T_ScriptLateUpdateTime | LateUpdate 很高 | 跟随/插值/后处理逻辑重、与动画/骨骼联动 | 同 T_ScriptUpdateTime;同时检查是否有可移到低频更新或事件驱动的逻辑 |
3.1 Frame Time(T_Frame_Time)
Section titled “3.1 Frame Time(T_Frame_Time)”表示 单帧耗时(ms) 的近似值,内部以 (1000 / FPS) 计算得到。
在项目中,Frame Time 的价值在于:它能把“流畅/卡顿”直接量化成毫秒数,便于你判断当前是否满足目标帧率(例如 60FPS≈16.6ms,30FPS≈33.3ms)。当你在优化时,Frame Time 也是最直观的“优化是否有效”的衡量指标。
典型用途:
- 移动端稳帧:目标 30FPS 时,Frame Time 需要尽量稳定在 ~33ms 内;偶发尖峰会带来明显掉帧感。
- 功能回归验证:新增系统后 Frame Time 上升,说明整体成本变高;需要进一步看是脚本还是渲染在变重。
3.2 All Render 3D(T_AllRender3D)
Section titled “3.2 All Render 3D(T_AllRender3D)”表示 本帧所有 3D 场景的提交渲染总耗时(ms)。它统计的是舞台渲染时对所有 Scene3D 的 renderSubmit() 调用耗时总和。
在项目中,这个指标最常用于回答两个问题:
- “卡顿是否主要来自 3D?”:把它与
T_AllRender2D、T_ScriptUpdateTime对比,通常可以快速判断瓶颈大类。 - “某个 3D 场景/相机是否变贵了?”:当你切换场景、开启/关闭特效或后处理后,该值常会立刻变化。
典型用途:
大场景、复杂材质、密集灯光、阴影开启、透明过多时,该项往往显著升高。
3.3 Depth Pass(T_DepthPass)
Section titled “3.3 Depth Pass(T_DepthPass)”表示 深度相关 Pass 的总耗时(ms),包括:
- 生成 Depth Texture(Depth)
- 生成 DepthNormals Texture(DepthNormals)
在项目中,该项常用于判断“深度预处理是否值得”:当你开启深度纹理(例如后处理需要 Depth/DepthNormals)时,Depth Pass 会额外绘制一遍(或多遍)场景对象,成本会直接体现在这里。
典型用途:
- 使用后处理依赖深度(景深、雾效、屏幕空间特效等)时,Depth Pass 通常必不可少。
- 对象数量非常多时,Depth Pass 可能成为明显开销;你需要考虑减少参与对象或降低相关效果质量。
3.4 Shadow Pass(T_ShadowPass)
Section titled “3.4 Shadow Pass(T_ShadowPass)”表示 阴影贴图渲染阶段的总耗时(ms),统计范围为主渲染流程中“渲染阴影贴图”的整体阶段耗时。
在项目中,该项用于衡量“阴影系统的总体代价”。阴影贴图往往需要对投射阴影的对象进行额外绘制(并可能按级联/光源类型重复执行),因此是移动端最常见的性能热点之一。
典型用途:
- 打开实时阴影后 FPS 明显下降:优先看
T_ShadowPass与CT_ShadowDrawCall。 - 阴影质量过高:阴影分辨率、级联数量、更新频率等都会显著影响该值。
3.5 3D Main Pass(T_3DMainPass)
Section titled “3.5 3D Main Pass(T_3DMainPass)”表示 3D 主渲染 Pass 总耗时(ms),通常包括不透明绘制、天空盒/环境绘制、透明绘制等主流程。
当你需要进一步拆分时,可配合下面两个子项(3.8、3.9)定位不透明与透明的占比。
在项目中,这个指标常用于判断“主渲染是否是最大开销”。如果 T_3DMainPass 很高,而 T_ShadowPass、T_DepthPass 不高,通常说明主要成本就发生在真正的主场景绘制阶段(材质复杂、光照复杂、透明过绘制等)。
3.6 3D Context Pre(T_3DContextPre)
Section titled “3.6 3D Context Pre(T_3DContextPre)”表示 3D 渲染上下文“绘制前准备阶段”的耗时(ms)。通常包含:
- Context 级别的 Shader Define 合并与准备
- RenderElement 的预更新(如材质/着色器准备、必要的编译与状态准备)
- Uniform/Buffer 等上传前的准备与触发
典型用途:
- “DrawCall 不高但还是卡”:可能卡在准备阶段(例如频繁 shader 编译、频繁 UBO 更新、频繁状态变更)。
- “首帧/切换材质时卡一下”:可能是 shader 首次编译或资源准备导致的尖峰。
3.7 3D Context Render(T_3DContextRender)
Section titled “3.7 3D Context Render(T_3DContextRender)”表示 3D 渲染上下文“实际绘制阶段”的耗时(ms)。它统计的是 RenderElement 执行 _render(...) 过程的时间,通常更贴近 GPU 提交/绘制相关的 CPU 开销。
在项目中,若 T_3DContextRender 明显高于 T_3DContextPre,往往意味着真正的绘制提交更重(例如大量 draw、状态切换、三角形数高、透明过绘制等)。
3.8 3D Main Pass Opaque(T_3DMainPass_Opaque)
Section titled “3.8 3D Main Pass Opaque(T_3DMainPass_Opaque)”表示 3D 主渲染 Pass 中不透明队列绘制耗时(ms)。
**典型用途:**不透明绘制通常占比最大;当开启大量静态物体、复杂材质、密集灯光时,可能明显升高。
3.9 3D Main Pass Trans(T_3DMainPass_Trans)
Section titled “3.9 3D Main Pass Trans(T_3DMainPass_Trans)”表示 3D 主渲染 Pass 中透明队列绘制耗时(ms)。
**典型用途:**透明队列常伴随排序、混合与过绘制,容易造成帧耗上升;当透明对象数量多/面积大时需要重点关注。
3.10 3D Batch Time(T_3DBatchTime)
Section titled “3.10 3D Batch Time(T_3DBatchTime)”表示 3D 合批(Batch)阶段耗时(ms)。在不透明渲染队列渲染前,引擎会尝试执行实例合批/队列合并,该项记录这一步的 CPU 开销。
**典型用途:**当开启动态合批/实例合批且场景对象数量多时,用于观察合批本身是否成为瓶颈。
3.11 Cull Main(T_CullMain)
Section titled “3.11 Cull Main(T_CullMain)”表示 主相机视锥裁剪(以及相关剔除逻辑)的耗时(ms),统计的是从渲染列表中筛选出本帧需要渲染对象的阶段成本。
典型用途:当场景对象非常多时,裁剪成本可能显著;可结合 BVH/遮挡剔除等手段优化。
3.12 Cull Shadow(T_CullShadow)
Section titled “3.12 Cull Shadow(T_CullShadow)”表示 阴影渲染阶段的裁剪耗时(ms),即从渲染列表中筛选出需要投射阴影的对象集合的成本(包含级联/聚光等阴影裁剪路径)。
**典型用途:**阴影开启后,除了 Shadow Pass 本身,Shadow Cull 也可能成为额外开销来源。
3.13 Render PostProcess(T_Render_PostProcess)
Section titled “3.13 Render PostProcess(T_Render_PostProcess)”表示 后处理(PostProcess)阶段耗时(ms)。当相机启用后处理且效果链不为空时,该项会统计后处理命令执行阶段的耗时。
**典型用途:**定位后处理链是否是帧耗主因(Bloom/SSR/SSAO 等通常成本较高)。
3.14 All Render 2D(T_AllRender2D)
Section titled “3.14 All Render 2D(T_AllRender2D)”表示 本帧所有 2D 场景渲染总耗时(ms),统计的是舞台渲染中 _render2d() 的整体耗时。
**典型用途:**当 UI/2D 特效密集时,用于判断 2D 是否是主要耗时来源。
3.15 2D Pass(T_2DPass)
Section titled “3.15 2D Pass(T_2DPass)”表示 2D Pass 管理器执行耗时(ms),统计的是 2D PassManager apply(...) 的整体阶段时间。
**典型用途:**当 2D 存在多 Pass(例如离屏、后处理、mask 等)时,可用于评估 Pass 管理与切换开销。
3.16 2D Context Pre(T_2DContextPre)
Section titled “3.16 2D Context Pre(T_2DContextPre)”表示 2D 渲染上下文“绘制前准备阶段”的耗时(ms)。常见包含:
- RenderElement2D 的
_prepare(...) - Uniform/Buffer 等上传触发
3.17 2D Context Render(T_2DContextRender)
Section titled “3.17 2D Context Render(T_2DContextRender)”表示 2D 渲染上下文“实际绘制阶段”的耗时(ms),统计的是 RenderElement2D 的 _render(...) 阶段时间。
3.18 Script Update Time(T_ScriptUpdateTime)
Section titled “3.18 Script Update Time(T_ScriptUpdateTime)”表示 本帧所有组件脚本 onUpdate() 执行的总耗时(ms)。它统计的是 ComponentDriver.callUpdate() 内遍历执行脚本更新的耗时。
**典型用途:**判断 CPU 是否主要消耗在脚本逻辑(AI、寻路、数值计算、状态机等)。
3.19 Script Late Update Time(T_ScriptLateUpdateTime)
Section titled “3.19 Script Late Update Time(T_ScriptLateUpdateTime)”表示 本帧所有组件脚本 onLateUpdate() 执行的总耗时(ms)。它统计的是 ComponentDriver.callLateUpdate() 内遍历执行脚本 LateUpdate 的耗时。
**典型用途:**判断 LateUpdate 是否存在重逻辑(例如跟随/插值、延迟刷新、骨骼/IK 驱动等)。
4. Draw Call(绘制调用)
Section titled “4. Draw Call(绘制调用)”在 IDE 中Draw Call 为分组标题,用于把“每帧绘制调用数量(CT_)”集中展示。CT_ 类型通常按 1 秒窗口计算平均值显示。
使用指南
- DrawCall 可以理解为“渲染提交次数”。次数越多,CPU 侧的渲染组织与状态切换成本通常越高。
- 很多项目的优化路径都是:先把 DrawCall 降下来(合批/减少材质与纹理切换),再看三角面与像素压力。
- 判断 DrawCall 是否异常时,建议同时看:
CT_ShaderChange(Shader 切换)与CT_Triangle(三角面数量)。
调试与优化速查表
| 指标 | 异常信号 | 常见原因 | 优先优化建议(建议按顺序) | 如何验证 |
|---|---|---|---|---|
CT_DrawCall | 总体很高且随场景规模线性上涨 | 对象/材质过碎;合批无效;频繁切换贴图/材质 | 合图集与材质统一 → 合批/实例化/静态合并 → 减少 UI 碎片与层级 | 观察 CT_DrawCall 下降,同时 T_3DContextRender/T_AllRender2D 是否下降 |
CT_2DDrawCall | UI 场景很高 | UI 节点过碎、mask/滤镜多、图集不统一 | UI 合图集 → 减少 mask/滤镜 → 列表虚拟化 → 减少动态文字/布局重建 | CT_2DDrawCall 下降且 T_AllRender2D 下降 |
CT_3DDrawCall | 3D 场景很高 | 网格/材质碎片化、光照/阴影拆批 | 合批/实例化/静态合并 → 降低材质种类 → 合并小物体 | CT_3DDrawCall 下降且 T_AllRender3D/T_3DContextRender 下降 |
CT_OpaqueDrawCall | 不透明批次高 | 不透明对象多、材质多 | 先做静态合并/实例化;减少材质变体 | CT_OpaqueDrawCall 下降,T_3DMainPass_Opaque 下降 |
CT_TransDrawCall | 透明批次高 | 粒子/透明材质过多,难合批 | 减少透明数量与覆盖面积;合并特效;能不透明就不透明 | CT_TransDrawCall 与 T_3DMainPass_Trans 同时下降 |
CT_ShadowDrawCall | 阴影批次高 | 投射阴影对象多、级联/多光源导致重复绘制 | 减少投射对象;降低阴影分辨率/级联/更新频率 | CT_ShadowDrawCall 与 T_ShadowPass 下降 |
CT_DepthCastDrawCall | 深度批次高 | Depth/DepthNormals 参与对象过多 | 只在必要时启用深度;减少参与对象 | CT_DepthCastDrawCall 与 T_DepthPass 下降 |
CT_Instancing_DrawCall | 该值为 0 但期望实例化 | 没启用实例化/材质不满足/数据不匹配 | 确认相同材质与渲染状态;用实例化替代重复对象 | CT_Instancing_DrawCall 上升且 CT_DrawCall 下降 |
CT_IndirectDrawCall | 值突然升高 | 使用了 Indirect Draw(WebGPU) | 通常是正常现象;若异常高,检查是否重复提交间接命令 | 与 CT_DrawCall、T_3DContextRender 联动判断是否带来收益 |
4.1 Opaque DrawCall(CT_OpaqueDrawCall)
Section titled “4.1 Opaque DrawCall(CT_OpaqueDrawCall)”表示 不透明渲染队列中的 DrawCall 数量(按渲染元素计数)。
典型用途:
- 不透明通常占 3D 绘制的大头。当该值很高时,常见原因是:对象过碎、材质过多、批次合并效果不好。
- 与
T_3DMainPass_Opaque联合解读:- DrawCall 高 + 耗时高:多半是“提交太多次”或“状态切换太频繁”。
- DrawCall 不高 + 耗时高:多半是“单次绘制很重”(shader 复杂、三角形多、光照复杂等)。
4.2 Trans DrawCall(CT_TransDrawCall)
Section titled “4.2 Trans DrawCall(CT_TransDrawCall)”表示 透明渲染队列中的 DrawCall 数量(按渲染元素计数)。
典型用途:
- 透明对象常常需要排序与混合,更难合批,也更容易出现“透明越多越卡”的情况。
- 当透明 DrawCall 高时,常见对应现象是:粒子/特效过多、UI 透明层级过复杂、半透明材质过碎。
4.3 Depth Cast DrawCall(CT_DepthCastDrawCall)
Section titled “4.3 Depth Cast DrawCall(CT_DepthCastDrawCall)”表示 Depth/DepthNormals Pass 中的 DrawCall 数量(用于生成深度相关贴图的绘制调用计数)。
典型用途:
- 该值上升通常意味着:有大量对象参与深度预渲染。当你启用依赖深度的后处理或效果时,需要重点关注它是否“把整个场景又画了一遍”。
- 若
T_DepthPass同时升高,说明 Depth Pass 已成为可见成本;可以考虑减少参与对象、降低深度需求或降低效果质量。
4.4 Shadow DrawCall(CT_ShadowDrawCall)
Section titled “4.4 Shadow DrawCall(CT_ShadowDrawCall)”表示 阴影贴图渲染中的 DrawCall 数量(投射阴影对象的绘制调用计数)。
典型用途:
- 阴影 DrawCall 高通常意味着:太多对象在投射阴影,或阴影级联/多光源导致重复绘制。
- 如果移动端性能紧张,阴影相关的 DrawCall 通常是最先需要压的指标(减少投影对象、降低阴影分辨率/更新频率)。
4.5 2D DrawCall(CT_2DDrawCall)
Section titled “4.5 2D DrawCall(CT_2DDrawCall)”表示 2D 渲染上下文提交的 DrawCall 数量(按 2D RenderElement 计数)。
典型用途:
- 2D DrawCall 高通常来自:UI 节点过碎、遮罩(mask)/滤镜过多、频繁换贴图/材质、动态文字/图集频繁变化等。
- 当你发现
T_AllRender2D升高时,优先看这个值,通常能快速判断是否是“提交次数太多”导致的。
4.6 3D DrawCall(CT_3DDrawCall)
Section titled “4.6 3D DrawCall(CT_3DDrawCall)”表示 3D 渲染上下文提交的 DrawCall 数量(按 3D RenderElement 计数)。
典型用途:
- 用它与
CT_2DDrawCall对比,可以快速判断 DrawCall 压力主要来自 2D 还是 3D。 - 当你做 3D 合批、实例化、LOD 时,3D DrawCall 的变化是最直接的收益体现。
4.7 DrawCall(CT_DrawCall)
Section titled “4.7 DrawCall(CT_DrawCall)”表示 总体 DrawCall 数量。该值通常来源于底层渲染设备每次执行 draw 指令时的计数(含 2D、3D)。
**典型用途:**它是“总体提交次数”的最终汇总。在做性能优化时,通常可以先把 CT_DrawCall 当作第一目标指标之一(尤其是 CPU 侧瓶颈时)。
4.8 Indirect DrawCall(CT_IndirectDrawCall)
Section titled “4.8 Indirect DrawCall(CT_IndirectDrawCall)”表示 Indirect Draw 的调用数量(如 WebGPU 的 drawIndirect/drawIndexedIndirect)。
注意:在 WebGL 路径下通常不会产生 Indirect Draw;若当前运行环境不支持/未使用 Indirect,则可能为 0。
4.9 Instancing DrawCall(CT_Instancing_DrawCall)
Section titled “4.9 Instancing DrawCall(CT_Instancing_DrawCall)”表示 实例化绘制(Instancing)的 DrawCall 数量。
典型用途:
- 该项用于判断“实例化是否真的在工作”。例如草海/树木/弹孔/同材质重复物体,如果实例化生效,通常能显著降低总体 DrawCall。
- 与
CT_DrawCall联合看:当CT_Instancing_DrawCall上升、但CT_DrawCall下降或保持稳定,通常意味着实例化在发挥作用。
5. GPU Buffer Resource/Memory(GPU 缓冲资源/内存)
Section titled “5. GPU Buffer Resource/Memory(GPU 缓冲资源/内存)”该分组包含 Buffer 类资源的 内存(M_,单位 MB) 与 数量(C_)。统计数据通常在 Buffer 创建、扩容、销毁时累计更新。
使用指南
- 这组指标主要用于回答两个问题:“GPU Buffer 是否过多/是否泄漏?”以及“Buffer 显存是否异常上涨?”
- 非常有用的实践是:在关键场景切换(进入战斗/退出战斗/加载大地图/打开关闭 UI)前后对比这些数值,观察是否“该降不降”(泄漏/未释放)或“突然暴涨”(资源配置不合理)。
5.1 GPU Buffer Memory(M_GPUBuffer)
Section titled “5.1 GPU Buffer Memory(M_GPUBuffer)”表示 所有 GPU Buffer 的内存总和(MB)。Buffer 包括顶点缓冲、索引缓冲、Uniform/UBO 等。
**典型用途:**用于监控“几何/Uniform 等数据在 GPU 上占了多少空间”。当该值持续上升且不回落时,往往意味着存在资源未释放、动态网格/粒子缓冲不断扩容等问题。
5.2 GPU Buffer Count(C_GPUBuffer)
Section titled “5.2 GPU Buffer Count(C_GPUBuffer)”表示 GPU Buffer 的对象数量(创建 +1,销毁 -1)。
**典型用途:**用于排查“Buffer 对象是否越来越多”。如果切换场景或关闭某系统后数量不下降,通常需要检查资源生命周期与引用关系。
5.3 Vertex Buffer Memory(M_VertexBuffer)
Section titled “5.3 Vertex Buffer Memory(M_VertexBuffer)”表示 顶点缓冲(Vertex Buffer)的内存占用(MB)。
**典型用途:**顶点缓冲直接对应网格/粒子/2D 生成网格的顶点数据;当你做“减少网格细分、减少粒子数量、减少 UI 动态重建”时,这项通常会下降。
5.4 Vertex Buffer Count(C_VertexBuffer)
Section titled “5.4 Vertex Buffer Count(C_VertexBuffer)”表示 顶点缓冲对象数量。
**典型用途:**用于判断顶点数据是否被过度拆分(大量小 VB)或存在未释放;数量过多也可能带来管理与上传开销。
5.5 Index Buffer Memory(M_IndexBuffer)
Section titled “5.5 Index Buffer Memory(M_IndexBuffer)”表示 索引缓冲(Index Buffer)的内存占用(MB)。
**典型用途:**索引缓冲与网格拓扑相关;如果你发现该项很高,通常意味着场景里存在大量网格或粒子系统使用了较大索引数据。
5.6 Index Buffer Count(C_IndexBuffer)
Section titled “5.6 Index Buffer Count(C_IndexBuffer)”表示 索引缓冲对象数量。
**典型用途:**与 C_VertexBuffer 类似,用于排查索引数据是否被过度拆分或未释放。
5.7 UBO Buffer Memory(M_UBOBuffer)
Section titled “5.7 UBO Buffer Memory(M_UBOBuffer)”表示 Uniform Buffer(UBO)的内存占用(MB)。
**典型用途:**UBO 常用于材质/相机/场景参数等统一数据块。该项过大可能意味着 UBO 分配策略不合理或存在大量动态 UBO。
5.8 UBO Buffer Count(C_UBOBuffer)
Section titled “5.8 UBO Buffer Count(C_UBOBuffer)”表示 Uniform Buffer(UBO)的对象数量。
**典型用途:**当该数量异常高时,通常意味着每个对象/材质都在生成独立 UBO,可能需要合并/共享策略。
5.9 Device Buffer Memory(M_DeviceBuffer)
Section titled “5.9 Device Buffer Memory(M_DeviceBuffer)”表示 设备侧 Buffer(WebGPU DeviceBuffer/StorageBuffer 等)的内存占用(MB)。
在 WebGPU 路径下通常更常见;在 WebGL 路径下可能为 0 或仅在某些扩展实现中产生。
用于 WebGPU 路径下观察“StorageBuffer/Compute 等相关数据结构”的资源占用是否合理。
5.10 Device Buffer Count(C_DeviceBuffer)
Section titled “5.10 Device Buffer Count(C_DeviceBuffer)”表示 设备侧 Buffer 的对象数量。
**典型用途:**配合 M_DeviceBuffer 一起用于排查设备缓冲对象是否泄漏或创建过多。
6. GPU Texture Resource/Memory(GPU 纹理资源/内存)
Section titled “6. GPU Texture Resource/Memory(GPU 纹理资源/内存)”该分组包含 Texture 类资源的 内存(M_,单位 MB) 与 数量(C_)。统计数据在纹理/RenderTexture 创建、更新显存估算值、销毁时累计更新。
使用指南
- 纹理与渲染纹理(RenderTexture)通常是移动端最容易“爆显存”的来源之一。
- 当出现卡顿、花屏、黑屏、WebGL 上下文丢失(context lost)、或设备发热严重时,优先检查这组指标,尤其是
M_GPUMemory、M_AllTexture、M_RenderTexture。
调试与优化速查表
| 指标 | 异常信号 | 常见原因 | 优先优化建议(建议按顺序) | 如何验证 |
|---|---|---|---|---|
M_AllTexture | 总纹理显存很高或切场景后不回落 | 贴图分辨率过大/数量过多;图集碎片化;未释放 | 优先压缩/降分辨率 → 减少常驻贴图 → 检查资源释放与缓存策略 | 切场景/关闭系统后数值能回落;加载峰值下降 |
M_RenderTexture | RT 显存很高 | 后处理/离屏 RT 过多、分辨率过高、RT 未回收 | 降低 RT 分辨率(尤其是后处理)→ 减少效果链/Pass → 检查 RT 池化/回收 | M_RenderTexture 与 C_RenderTexture 同时下降 |
C_AllTexture | 数量持续上涨 | 重复创建/重复加载、缓存失控、引用未释放 | 检查资源生命周期与引用;避免重复加载;合理分组与释放 | 场景切换后能回落到稳定值 |
M_Texture2D/C_Texture2D | UI/贴图类指标异常高 | UI 图集过多/过大;多语言/皮肤资源常驻 | 合并图集/按需加载;降低贴图尺寸;做场景分包 | 指标下降且 UI 渲染性能改善 |
M_TextureCube | 立方体显存异常 | 天空盒/反射探针分辨率过高 | 降低 cube 分辨率;减少探针数量;按场景启用 | 显存下降且画面无明显劣化 |
M_Texture2DArray | 数组纹理显存异常 | 层数过多/分辨率过高 | 控制层数与分辨率;按需创建 | 显存下降且功能正常 |
6.1 All Texture Memory(M_AllTexture)
Section titled “6.1 All Texture Memory(M_AllTexture)”表示 所有纹理(含普通纹理与 RenderTexture)的显存占用总和(MB)。
**典型用途:**它是最直观的“纹理显存总览”。当你怀疑贴图过大、贴图加载过多或 RT 使用过度时,先看它是否超出目标机型的可承受范围。
6.2 All Texture Count(C_AllTexture)
Section titled “6.2 All Texture Count(C_AllTexture)”表示 所有纹理对象数量。
**典型用途:**用于排查纹理是否“越用越多”。如果切场景后数量不回落,通常存在纹理资源未释放或缓存策略不当。
6.3 Texture2D Memory(M_Texture2D)
Section titled “6.3 Texture2D Memory(M_Texture2D)”表示 2D 纹理显存占用(MB)。
**典型用途:**项目里绝大多数美术贴图、UI 图集都属于 Texture2D。该项过高时,常见处理是:压缩纹理、降低分辨率、减少常驻贴图、拆分加载策略。
6.4 Texture2D Count(C_Texture2D)
Section titled “6.4 Texture2D Count(C_Texture2D)”表示 2D 纹理对象数量。
**典型用途:**Texture2D 数量过多通常意味着:图集碎片化、重复加载、或资源未释放。排查时建议对照资源加载点与缓存策略。
6.5 TextureCube Memory(M_TextureCube)
Section titled “6.5 TextureCube Memory(M_TextureCube)”表示 立方体纹理显存占用(MB)。
**典型用途:**常用于天空盒、反射探针等。立方体贴图分辨率很容易导致显存飙升(6 面),在移动端需要特别谨慎。
6.6 TextureCube Count(C_TextureCube)
Section titled “6.6 TextureCube Count(C_TextureCube)”表示 立方体纹理对象数量。
**典型用途:**用于排查反射探针/天空盒资源是否重复创建或未释放。
6.7 Texture3D Memory(M_Texture3D)
Section titled “6.7 Texture3D Memory(M_Texture3D)”表示 3D 纹理显存占用(MB)。
**典型用途:**3D 纹理常用于体积数据、某些高级效果或 GPU 计算相关数据。若项目并未使用相关功能但数值不为 0,建议检查是否误用或资源未回收。
6.8 Texture3D Count(C_Texture3D)
Section titled “6.8 Texture3D Count(C_Texture3D)”表示 3D 纹理对象数量。
**典型用途:**用于判断 3D 纹理是否被频繁创建(可能带来显存与创建成本)。
6.9 Texture2DArray Memory(M_Texture2DArray)
Section titled “6.9 Texture2DArray Memory(M_Texture2DArray)”表示 2DArray 纹理显存占用(MB)。
**典型用途:**Texture2DArray 常用于批量纹理采样、实例化渲染等。该项偏高时,需要关注数组层数与分辨率是否过大。
6.10 Texture2DArray Count(C_Texture2DArray)
Section titled “6.10 Texture2DArray Count(C_Texture2DArray)”表示 2DArray 纹理对象数量。
**典型用途:**用于排查 Texture2DArray 是否被重复创建或未释放。
6.11 RenderTexture Memory(M_RenderTexture)
Section titled “6.11 RenderTexture Memory(M_RenderTexture)”表示 所有 RenderTexture 的显存占用(MB)。
**典型用途:**RenderTexture 常用于后处理、离屏渲染、UI 特效、反射等。它们往往分辨率高、数量多时显存与带宽成本非常大,是性能问题的高发区。
6.12 RenderTexture Count(C_RenderTexture)
Section titled “6.12 RenderTexture Count(C_RenderTexture)”表示 RenderTexture 对象数量。
**典型用途:**当该数量过高时,常见原因是:多相机/多后处理链/频繁创建临时 RT 未回收。建议检查 RT 池化与生命周期管理。
7. GPU Misc(GPU 其他统计)
Section titled “7. GPU Misc(GPU 其他统计)”使用指南
这一组更偏“渲染细节”。当你已经知道是渲染在慢(例如 T_AllRender3D 高),它们能帮助你进一步判断“慢在提交次数、Shader 切换、几何量,还是数据上传”。
调试与优化速查表
| 指标 | 异常信号 | 常见原因 | 优先优化建议(建议按顺序) | 如何验证 |
|---|---|---|---|---|
M_GPUMemory | 总显存高或不回落 | 纹理/RT/Buffer 占用过高或泄漏 | 优先压缩贴图与降 RT → 检查资源释放 → 复用与池化 | 场景切换/关闭系统后回落;峰值下降 |
CT_ShaderChange | 频繁切换 | 材质/Shader 过碎;同屏很多不同材质小物体 | 统一材质与 shader 变体;减少材质种类;合并小物体 | CT_ShaderChange 下降且 T_3DContextRender 下降 |
CT_Triangle | 三角形异常高 | 模型面数高、LOD 缺失、粒子网格过多 | LOD/简模;减少同屏高模;减少粒子网格 | CT_Triangle 下降且画面可接受 |
CT_BufferUploadCount | 上传次数高 | 动态 VB/IB/UBO 更新频繁 | 减少每帧更新;合并批量更新;缓存与对象池 | 次数下降且帧耗尖峰减少 |
CT_GeometryBufferUploadCount | 几何上传高 | 动态网格/文字/粒子重建 | 缓存几何、降低重建频率、减少动态文字更新 | 次数下降且 2D/3D 对应耗时下降 |
CT_UBOBufferUploadCount/CT_UBOBufferUploadMemory | UBO 上传次数或量高 | 每帧修改大量材质/对象参数 | 减少不必要参数改动;共享批次参数;合并更新 | 上传指标下降且 T_3DContextPre/Render 下降 |
7.1 GPU Memory(M_GPUMemory)
Section titled “7.1 GPU Memory(M_GPUMemory)”表示 GPU 侧总显存估算(MB)。通常会在 Buffer 与 Texture 的内存变更时同步累计更新,是一个“总览型”指标。
**典型用途:**这是最建议长期关注的指标之一。显存过高会导致加载抖动、渲染不稳定甚至崩溃(尤其是移动端)。如果你看到它在某些操作后持续上涨且不回落,优先排查资源释放与 RT 池。
7.2 Shader Change(CT_ShaderChange)
Section titled “7.2 Shader Change(CT_ShaderChange)”表示 Shader Program 切换次数(按 1 秒窗口平均)。当渲染过程中频繁 useProgram 时会增加。
典型用途:
- Shader 切换次数高,通常意味着材质/Shader 过于碎片化,导致 GPU 状态切换频繁。
- 常见在:同屏大量不同材质的小物体、UI 混用大量不同 shader、特效材质种类过多等场景。
7.3 Triangle(CT_Triangle)
Section titled “7.3 Triangle(CT_Triangle)”表示 三角形数量(每帧/每秒窗口平均,取决于统计窗口显示策略)。
典型用途:
- 三角形数量直接反映“几何复杂度”,是判断顶点处理压力的核心指标之一。
- 常见用于:评估模型面数是否超标、是否需要 LOD、是否需要简模或合批。
7.4 Buffer Upload Count(CT_BufferUploadCount)
Section titled “7.4 Buffer Upload Count(CT_BufferUploadCount)”表示 BufferSubData 上传次数(例如 WebGL 中对 buffer 的数据更新次数)。
典型用途:
- 该值高说明 CPU->GPU 数据更新频繁,容易造成 CPU 开销与带宽压力。
- 常见来源:粒子系统每帧写 VB、动态文字/图形频繁重建、动态网格/蒙皮数据频繁更新等。
7.5 Geometry Buffer Upload Count(CT_GeometryBufferUploadCount)
Section titled “7.5 Geometry Buffer Upload Count(CT_GeometryBufferUploadCount)”表示 几何 Buffer(VB/IB)上传次数。
**典型用途:**更聚焦“几何数据上传”。当你看到 DrawCall 不高但仍卡顿时,如果该项很高,往往说明“上传在拖慢你”,需要减少每帧更新或改为缓存/批量更新。
7.6 UBO Buffer Upload Count(CT_UBOBufferUploadCount)
Section titled “7.6 UBO Buffer Upload Count(CT_UBOBufferUploadCount)”表示 UBO 上传次数。
7.7 UBO Buffer Upload Memory(CT_UBOBufferUploadMemory)
Section titled “7.7 UBO Buffer Upload Memory(CT_UBOBufferUploadMemory)”表示 UBO 上传的数据量(MB)(统计上传的 size 累计)。
典型用途:
- 这两项一起用于衡量“Uniform 数据更新是否过量”。当对象数量多且每帧大量改材质参数时,UBO 上传次数与上传量会显著升高。
- 常见优化:减少不必要的每帧参数改动、合并相同材质参数、尽量批次共享、使用实例化将 per-object 数据打包上传。
8. Other Game Count/Time(其他对象数量/耗时)
Section titled “8. Other Game Count/Time(其他对象数量/耗时)”使用指南
- 这一组用于回答“场景规模有多大、对象有多少、动画/骨骼/粒子更新是否变重”。
- 当你不知道从哪里开始优化时,先看对象数量是否异常(
C_Sprite2DCount/C_Sprite3DCount/C_BaseRenderCount),再看更新耗时是否异常(T_AnimatorUpdate/T_SkinBoneUpdate/T_ShurikenUpdate)。
8.1 Sprite2D Count(C_Sprite2DCount)
Section titled “8.1 Sprite2D Count(C_Sprite2DCount)”表示 处于激活层级中的 2D 节点(Node/Sprite)数量。节点激活进入层级时 +1,退出时 -1。
典型用途:
- 2D 节点数过高,通常意味着 UI 结构过复杂或拆分过碎,会带来:遍历/布局/事件/脚本/渲染的综合压力。
- 常见场景:列表未做虚拟化、复杂 HUD 常驻、动态生成节点未回收等。
8.2 Sprite3D Count(C_Sprite3DCount)
Section titled “8.2 Sprite3D Count(C_Sprite3DCount)”表示 处于激活层级中的 3D 节点(Sprite3D)数量。
**典型用途:**3D 节点数过高通常意味着场景对象规模大,裁剪与渲染组织成本会上升;可与 T_CullMain 联合判断是否“裁剪阶段就很贵”。
8.3 BaseRender Count(C_BaseRenderCount)
Section titled “8.3 BaseRender Count(C_BaseRenderCount)”表示 所有渲染器(BaseRender 派生类)的数量,例如 MeshRenderer、SkinnedMeshRenderer、ParticleRenderer 等。
**典型用途:**渲染器数量决定了“需要被渲染系统管理的对象规模”。当该值很高时,通常意味着渲染对象非常多,DrawCall/裁剪/更新的压力都会增加。
8.4 MeshRender Count(C_MeshRenderCount)
Section titled “8.4 MeshRender Count(C_MeshRenderCount)”表示 MeshRenderer 的数量。
**典型用途:**用于判断普通网格渲染器数量是否过多。若数量巨大,建议检查:是否能合并静态物体、是否能使用实例化、是否需要 LOD/裁剪策略。
8.5 SkinnedMeshRender Count(C_SkinnedMeshRenderCount)
Section titled “8.5 SkinnedMeshRender Count(C_SkinnedMeshRenderCount)”表示 SkinnedMeshRenderer 的数量。
**典型用途:**蒙皮渲染器数量对 CPU(骨骼计算)与 GPU(蒙皮数据/顶点处理)都有压力。角色多、怪物多、同屏动画多时需要重点关注。
8.6 ShurikenParticleRender Count(C_ShurikenParticleRenderCount)
Section titled “8.6 ShurikenParticleRender Count(C_ShurikenParticleRenderCount)”表示 ShurikenParticleRenderer 的数量。
**典型用途:**用于判断粒子渲染器数量规模。粒子系统过多时往往带来透明绘制、过绘制、VB 更新等问题,可与 CT_TransDrawCall、T_ShurikenUpdate 联合排查。
8.7 Animator Update(T_AnimatorUpdate)
Section titled “8.7 Animator Update(T_AnimatorUpdate)”表示 Animator 更新耗时(ms)。统计范围为 Animator 在更新/融合/事件脚本等流程中的总耗时。
**典型用途:**当同屏角色/怪物数量增加导致卡顿时,这项经常是“脚本之外”的重要 CPU 消耗点。若该项高,通常需要降低动画更新频率、减少状态机复杂度、减少同屏活动角色数量等。
8.8 SkinBone Update(T_SkinBoneUpdate)
Section titled “8.8 SkinBone Update(T_SkinBoneUpdate)”表示 蒙皮骨骼数据更新耗时(ms)。该项统计的是 SkinnedMeshRenderer 在渲染更新阶段进行骨骼矩阵计算与提交的耗时。
**典型用途:**这项高通常意味着骨骼数量多、蒙皮角色多或更新过于频繁。常见优化方向是:降低骨骼数、减少同屏蒙皮对象、使用简化骨架/LOD、减少不可见角色更新。
8.9 Shuriken Update(T_ShurikenUpdate)
Section titled “8.9 Shuriken Update(T_ShurikenUpdate)”表示 Shuriken 粒子系统更新耗时(ms)。该项统计粒子系统每帧(或按更新掩码)进行发射、更新并可能写回 VertexBuffer 的阶段成本。
**典型用途:**粒子往往是移动端性能问题高发点(尤其是透明过绘制 + 每帧更新)。当该项高时,常见策略是:减少粒子数量、降低发射频率、合并特效、缩短生命周期、减少全屏覆盖的透明粒子。
9. physics 3D(3D 物理)
Section titled “9. physics 3D(3D 物理)”physics 3D 为分组标题,用于汇总物理模块相关统计。需要注意:物理模块存在两套统计来源:
- 一类直接写入
LayaGL.statAgent(因此能直接被统计面板显示)。 - 一类写入
Physics3DStatInfo(需要开发者在需要时同步到statAgent,否则统计面板可能显示为 0)。该类更适用于物理内部“每帧清零”的事件计数。
使用指南
- 物理相关卡顿最常见的表现是:同屏刚体/碰撞体数量增多时帧率下降,或者事件风暴(Enter/Stay/Exit)导致脚本与事件派发变慢。
- 推荐先看:
T_Physics_Simulation(模拟本身)、T_Physics_UpdateNode(同步)、T_PhysicsEvent(派发)与C_PhysicsEventCount(事件量),快速判断问题属于“模拟算不过来”还是“事件太多”。
调试与优化速查表
| 指标 | 异常信号 | 常见原因 | 优先优化建议(建议按顺序) | 如何验证 |
|---|---|---|---|---|
T_Physics_Simulation | 同屏刚体多时显著上升 | 动态刚体多、碰撞形状复杂、约束多 | 减少动态刚体;简化碰撞体;降低更新频率/子步 | 模拟耗时下降且行为可接受 |
T_Physics_UpdateNode | 同步耗时高 | 大量刚体回写 transform | 减少动态刚体;减少每帧强制同步;降低更新频率 | 同步耗时下降 |
T_PhysicsEvent | 事件派发耗时高 | 事件风暴(Stay 多)、过滤不足 | 做层过滤/事件过滤;减少触发器密度;减少持续接触 | 派发耗时与事件数下降 |
C_PhysicsEventCount | 数量异常高 | Stay 过多、触发器范围过大、碰撞组未过滤 | 优先做碰撞组/层过滤;减少触发器覆盖;避免无意义的 Stay 监听 | 数量下降且玩法不受影响 |
C_Physica*/C_PhysicsJoint | 数量过大或不回落 | 物理对象未销毁/未移除 | 检查生命周期;场景切换释放;避免重复创建 | 切场景后数量回落到稳定值 |
9.1 Physics Simulation(T_Physics_Simulation)
Section titled “9.1 Physics Simulation(T_Physics_Simulation)”表示 物理世界模拟阶段耗时(ms)(通常对应 simulate + fetchResults 等步骤)。
如果当前运行后端未对该项写入
statAgent,统计面板可能显示为 0;。
**典型用途:**该项高通常意味着模拟计算量大(刚体/碰撞体多、约束多、迭代次数高等)。新人优化时常见策略是:减少同屏动态刚体、降低物理更新频率/子步、简化碰撞形状。
9.2 Physics Update Node(T_Physics_UpdateNode)
Section titled “9.2 Physics Update Node(T_Physics_UpdateNode)”表示 物理到渲染的变换同步耗时(ms)(例如刚体 transform 回写到节点)。
9.3 Physics Event(T_PhysicsEvent)
Section titled “9.3 Physics Event(T_PhysicsEvent)”表示 物理事件派发阶段耗时(ms)(碰撞/触发 enter/stay/exit 的事件分发)。
9.4 Physics Event Count(C_PhysicsEventCount)
Section titled “9.4 Physics Event Count(C_PhysicsEventCount)”表示 物理事件数量(Enter/Stay/Exit 等事件累加的总次数)。
在 PhysX 实现中,该计数主要写入
Physics3DStatInfo;
**典型用途:**事件数量是“物理事件风暴”的直接信号。若该值过高,常见原因是:大量物体持续接触(Stay 过多)、触发器范围过大/过密、没有做层过滤/事件过滤等。
9.5 Physics Collider(T_PhysicsCollider)
Section titled “9.5 Physics Collider(T_PhysicsCollider)”表示 碰撞(Collision)事件处理阶段耗时(ms)(不含 Trigger)。
9.6 Physics Trigger(T_PhysicsTrigger)
Section titled “9.6 Physics Trigger(T_PhysicsTrigger)”表示 触发器(Trigger)事件处理阶段耗时(ms)。
9.7 Physics Collider Enter(T_PhysicsColliderEnter)
Section titled “9.7 Physics Collider Enter(T_PhysicsColliderEnter)”表示 Collision Enter 事件处理耗时(ms)。
9.8 Physics Collider Exit(T_PhysicsColliderExit)
Section titled “9.8 Physics Collider Exit(T_PhysicsColliderExit)”表示 Collision Exit 事件处理耗时(ms)。
9.9 Physics Collider Stay(T_PhysicsColliderStay)
Section titled “9.9 Physics Collider Stay(T_PhysicsColliderStay)”表示 Collision Stay 事件处理耗时(ms)。
9.10 Physics Trigger Enter(T_PhysicsTriggerEnter)
Section titled “9.10 Physics Trigger Enter(T_PhysicsTriggerEnter)”表示 Trigger Enter 事件处理耗时(ms)。
9.11 Physics Trigger Exit(T_PhysicsTriggerExit)
Section titled “9.11 Physics Trigger Exit(T_PhysicsTriggerExit)”表示 Trigger Exit 事件处理耗时(ms)。
9.12 Physics Trigger Stay(T_PhysicsTriggerStay)
Section titled “9.12 Physics Trigger Stay(T_PhysicsTriggerStay)”表示 Trigger Stay 事件处理耗时(ms)。
9.13 Physics Dynamic RigidBody(C_PhysicaDynamicRigidBody)
Section titled “9.13 Physics Dynamic RigidBody(C_PhysicaDynamicRigidBody)”表示 动态刚体数量(创建/加入物理世界时 +1,移除时 -1)。
9.14 Physics Static RigidBody Count(C_PhysicaStaticRigidBody)
Section titled “9.14 Physics Static RigidBody Count(C_PhysicaStaticRigidBody)”表示 静态刚体数量。
9.15 Physics Kinematic RigidBody Count(C_PhysicaKinematicRigidBody)
Section titled “9.15 Physics Kinematic RigidBody Count(C_PhysicaKinematicRigidBody)”表示 运动学刚体数量。
9.16 Physics Character Controller Count(C_PhysicaCharacterController)
Section titled “9.16 Physics Character Controller Count(C_PhysicaCharacterController)”表示 角色控制器数量。
9.17 Physics Joint Count(C_PhysicsJoint)
Section titled “9.17 Physics Joint Count(C_PhysicsJoint)”表示 物理关节数量。
10. Loader(加载)
Section titled “10. Loader(加载)”Loader 为分组标题,用于汇总资源加载(解析/网络)相关统计。
使用指南
- 加载问题通常表现为:加载慢、加载卡顿、首包大、网络波动下失败率高。这组指标能帮助你区分“慢在解析还是慢在网络”。
- 推荐做法:在关键加载阶段(进入游戏、切场景、打开大 UI)观察
T_LoadRequestTime与T_LoadResourceTime的变化,判断瓶颈属于哪一段。
调试与优化速查表
| 指标 | 异常信号 | 常见原因 | 优先优化建议(建议按顺序) | 如何验证 |
|---|---|---|---|---|
T_LoadRequestTime | 下载时间高或波动大 | 网络带宽/延迟;资源体积过大;请求过碎 | 资源压缩/分包;合并请求;优化 CDN;合理并发与缓存 | 下载时间下降;请求数下降;失败率降低 |
C_LoadRequestCount | 请求次数很高 | 资源拆分过碎、缺少合包/图集 | 合包、合图集、预加载关键资源 | 请求数下降且首包改善 |
T_LoadResourceTime | 解析时间高 | 解析重(模型/贴图解码/图集/反序列化) | 降低资源复杂度(模型面数/贴图尺寸);延迟解析;分帧加载 | 解析时间下降且加载卡顿减少 |
C_LoadResourceCount | 加载次数异常高 | 重复加载/缓存失效/逻辑反复触发 | 排查重复加载点;统一缓存;避免循环触发 | 次数下降且内存/显存更稳定 |
10.1 Load Resource Time(T_LoadResourceTime)
Section titled “10.1 Load Resource Time(T_LoadResourceTime)”表示 资源加载 + 解析总耗时(ms)。该项统计的是一次 Loader.load(...) 内部执行具体 assetLoader.load(task) 的耗时(含解析)。
典型用途:
- 该项更偏“加载 + 解析”的整体成本。若网络不慢但这里很高,通常说明解析阶段重(例如模型解析、纹理解码、图集解析、资源反序列化等)。
- 当你遇到“加载时卡一下(主线程抖动)”,这项往往是第一排查对象之一。
10.2 Load Resource Count(C_LoadResourceCount)
Section titled “10.2 Load Resource Count(C_LoadResourceCount)”表示 资源加载次数(每触发一次资源加载任务 +1)。
**典型用途:**用于评估“加载次数是否异常”。如果同一资源被重复加载、或逻辑反复触发加载,会导致加载次数偏高并带来不必要的 IO 与解析开销。
10.3 Load Request Count(C_LoadRequestCount)
Section titled “10.3 Load Request Count(C_LoadRequestCount)”表示 网络请求次数(每发起一次下载请求 +1)。
**典型用途:**用于评估网络请求是否过碎。请求过多会带来并发压力与调度开销,常见优化是合包、合图集、合理设置并发与缓存。
10.4 Load Request Time(T_LoadRequestTime)
Section titled “10.4 Load Request Time(T_LoadRequestTime)”表示 网络下载耗时(ms)(从请求发起到完成回调的时间差)。
**典型用途:**用于判断“慢在网络”。如果该项高而 T_LoadResourceTime 不高,通常意味着网络带宽/延迟问题或资源体积过大;需要考虑 CDN、资源压缩、分包、断点与重试策略等。