关于 performance
面向游戏开发者的性能优化技能,指导如何先用 vitexec 分析运行时瓶颈,再针对绘制调用、GPU 工作量或逐帧 CPU 开销采取措施。内容涵盖实例化、剔除、对象复用和分摊计算。
主要功能
- 01用性能追踪定位瓶颈
- 02通过实例化减少绘制调用
- 03合并静态几何体
- 04使用剔除与 LOD 降低 GPU 负担
- 05复用对象并分摊逐帧计算
适用场景
- 01排查大型场景中的帧率卡顿
- 02优化大量重复物体的渲染
- 03减少透明粒子和阴影开销
- 04降低更新循环中的分配与垃圾回收
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ drawcall-ai/ skills --skill performance安装后在 Claude Code 中输入/performance确认已加载。
详细介绍
性能
一个只有少量物体时运行流畅的场景,在加入人群、粒子和大型地图后就会卡顿。帧率受三项预算限制——绘制调用、GPU 工作量和每帧 CPU 开销/内存分配——下面的优化手段分别针对其中一项。先测量,再修复实际瓶颈。
先测量
不要凭猜测。使用 vitexec --performance-trace 对运行中的游戏进行性能分析(针对热点函数,还可以使用 --cpu-profile)。根据帧时间的来源判断:每帧脚本/JS 耗时长且主线程繁忙,说明受 CPU 限制(采用“减少每帧 CPU 开销”);主线程开销低,但 GPU/渲染耗时高、绘制调用多或过度绘制严重,说明受 GPU 限制(采用“减少 GPU 工作量”/“减少绘制调用”)。修复性能跟踪实际指出的瓶颈,而不是你假设的瓶颈。
减少绘制调用
每个独立网格大致需要一次绘制调用;成千上万个网格会让 CPU 在提交工作时受阻。
- 实例化:将同一几何体的多个副本(树木、岩石、草、子弹、相同的敌人)作为一个
InstancedMesh渲染。使用mesh.setMatrixAt(i, matrix)设置每个副本的位置,然后设置mesh.instanceMatrix.needsUpdate = true——省略此标记会导致实例无法移动。 - 合并静态几何体:将使用相同材质且不会移动的网格合并为一个缓冲几何体。需要权衡的是,合并后的网格只能整体剔除,因此不要合并分布在大范围内、适合按物体进行视锥体剔除的几何体。
- 共享材质/纹理:重复使用材质和纹理实例;图集可以让不同道具共享一次绘制调用。
减少 GPU 工作量
- 剔除:保留
frustumCulled = true(默认值),跳过视野外的物体;对于超大世界,还要按距离进行剔除。 - LOD:将远处物体替换为开销更低的版本(
THREE.LOD),或完全隐藏远处的细节。 - 过度绘制:限制大型透明/加色粒子和全屏效果;限制阴影贴图尺寸和投射阴影的光源数量。
减少每帧 CPU 开销
- 使用对象池,不要分配新对象:重复使用对象,并复用临时的
Vector3/Quaternion/Matrix4实例,避免在更新循环中调用new——每帧分配内存会造成 GC 卡顿。 - 限制动态数量:限制存活的敌人、粒子和投射物数量;从对象池中回收,而不是反复创建和销毁。
- 避免触发重新编译:运行时更改光源数量或材质的 defines 会导致着色器重新编译(参见
lights技能)。请保持这些设置不变。 - 分摊工作量:将寻路、AI 重新规划等开销大的系统分摊到多帧中执行,而不是每帧都完成所有工作。
评论
支持 Markdown