threejs-performance

$npx mdskill add staruhub/ClaudeSkills/threejs-performance

Diagnose and fix Three.js performance issues like frame drops and memory leaks.

  • Solves frame drops, memory leaks, slow loading, and excessive draw calls.
  • Uses Three.js, React Three Fiber, WebGPU, Draco, KTX2, and gltf-transform.
  • Uses a decision tree based on symptoms like draw calls and memory growth.
  • Provides code examples, compression pipelines, and migration guides.

SKILL.md

.github/skills/threejs-performanceView on GitHub ↗
---
name: threejs-performance
version: 1.1.0
description: Three.js 性能优化指南。当 Three.js/React Three Fiber 项目出现掉帧、内存增长、加载缓慢、绘制调用过多,或需要迁移 WebGPU、实现大规模粒子/实例化渲染、配置资源压缩管线时使用。触发关键词:"Three.js 优化"、"WebGPU"、"draw calls"、"内存泄漏"、"TSL"、"InstancedMesh"、"R3F 优化"等。不用于:通用 React 性能问题(用 vercel-react-best-practices)、WebGL/Three.js 入门教学、3D 美术资产的制作本身。
---

# Three.js 性能优化指南

## 黄金法则

**绘制调用 < 100 次/帧。** 三角形数量不如绘制调用数量重要;超过 500 次绘制调用,强大 GPU 也会吃力。用 `renderer.info.render.calls` 监控(完整监控代码见 `references/examples.md`)。

## 诊断决策树

| 症状 | 先查 | 深入 |
|------|------|------|
| 掉帧、卡顿 | `renderer.info.render.calls` 是否 >100 | 实例化/合批(下文),后处理链 |
| 内存持续增长 | `renderer.info.memory` 的 geometries/textures 计数是否只增不减 | dispose 铁律(下文),`references/examples.md` 完整清理代码 |
| 加载慢、显存爆 | 模型是否未压缩 | `references/assets.md` 压缩管线 |
| 粒子/物理瓶颈 | CPU 粒子是否 >5 万 | WebGPU 计算着色器,`references/webgpu.md` |
| R3F 项目莫名重渲染 | useFrame 里是否 setState | R3F 三规则(下文) |

## 各领域规则速查

### WebGPU:何时迁移
绘制调用密集掉帧 / 需要计算着色器做物理粒子(CPU 约 5 万上限,GPU 可达数百万)/ 复杂后处理链卡顿。
`WebGPURenderer` 必须 `await renderer.init()`。TSL 写一次自动编译 WGSL/GLSL。
浏览器支持下限(记录时点数据,现查 caniuse 为准):Chrome/Edge 113+,Firefox 141+,Safari 26+。
初始化回退、TSL 完整指南、计算着色器示例:`references/webgpu.md`。

### 绘制调用优化
- 大量**相同**几何体(树、石头)→ `InstancedMesh`:1000 棵树 = 1 次绘制
- 多个**不同**几何体共享材质 → `BatchedMesh`
- 静态小物件 → `mergeGeometries` 合并
- 材质**共享复用**,永远不要在循环里 `new Material`

### 资源压缩(收益数字)
- Draco 几何体压缩:体积减 90-95%
- KTX2 纹理:GPU 内存约降 10 倍
- 一条命令:`gltf-transform optimize model.glb out.glb --texture-compress ktx2 --compress draco`
- 解码器路径配置与 Meshopt/Draco 选型:`references/assets.md`

### 内存铁律
**Three.js 不会自动回收 GPU 资源。** 移除对象必须:geometry.dispose() + 遍历 material 的所有 texture 属性逐个 dispose + material.dispose();GLTF 的 ImageBitmap 还要 `texture.source.data.close()`。频繁增删对象用对象池。完整代码:`references/examples.md`。

### 着色器三规则
① 移动端 `precision mediump float`(约快 2 倍)② 用 `mix/step` 替代 if 分支(分支破坏 GPU 并行)③ 数据打包进 vec4,一次纹理取 4 个值。

### 光照阴影预算
活动光源 ≤3;PointLight 阴影 = 每光源 6 次阴影贴图渲染;贴图尺寸移动端 512-1024、桌面 1024-2048;静态场景 `shadowMap.autoUpdate = false` 手动触发 + 烘焙光照。

### React Three Fiber 三规则
① 动画走 `useFrame` 直改 ref,**永远不在 useFrame 里 setState** ② 静态场景用 `frameloop="demand"` + `invalidate()` 按需渲染 ③ 显隐切 `visible` 属性,不要条件挂载 `{show && <Model/>}`(重挂载重建资源)。完整优化模板:`references/examples.md`。

### 后处理选型
WebGL → `pmndrs/postprocessing`(多效果合并 EffectPass);WebGPU → 原生 TSL 后处理管线。两者完整设置:`references/examples.md`。

## 验收标准(优化任务完成前自查)

- [ ] `renderer.info.render.calls` < 100(超出需给出场景理由)
- [ ] `renderer.info.memory` 计数在增删对象后回落,无单调增长
- [ ] 目标设备实测帧率达标(移动端也要测,不只桌面)
- [ ] 发布资源经过 Draco/KTX2 压缩管线
- [ ] 每条优化建议都对应用户场景的实测症状,不是清单式全量套用

## 不做什么

- React 组件层的通用性能问题(memo/useMemo/bundle)→ `vercel-react-best-practices`
- Three.js 基础教学、场景搭建入门
- 模型/贴图美术制作本身(只管加载与渲染性能)
- 未量测先优化:没有 renderer.info 或帧率数据时,先装监控再动手

## 已知陷阱

| 陷阱 | 具体表现 | 应对 |
|------|---------|------|
| dispose 不彻底 | 只 dispose 了 geometry,material 上挂的 texture 全泄漏 | 遍历 material 属性逐个 dispose;GLTF ImageBitmap 还需 close() |
| useFrame 里 setState | 每帧触发 React 重渲染,帧率断崖 | 直改 ref;状态只在交互事件里更新 |
| 条件挂载切换模型 | `{show && <Model/>}` 每次重建几何体和纹理 | 切 visible 属性 |
| demand 模式忘 invalidate | 相机动了画面不动,被当成"卡死" | 交互回调里调用 invalidate() |
| 循环里 new Material | 1000 个网格 1000 个材质,合批全部失效 | 材质提到循环外共享 |
| PointLight 随手加阴影 | 一个点光 6 次阴影渲染,移动端直接跪 | 优先 SpotLight/DirectionalLight 阴影,点光阴影只留一个 |

## 调试工具

**stats-gl**(FPS/CPU/GPU)· **lil-gui**(实时调参)· **Spector.js**(WebGL 帧捕获)· **three-mesh-bvh**(8 万+ 面 @60fps 射线检测)· **r3f-perf**(R3F 监控)

## 参考文档(按需加载)

| 文件 | 何时读 |
|------|--------|
| `references/webgpu.md` | 迁移 WebGPU / 写 TSL / 计算着色器时 |
| `references/assets.md` | 配置压缩管线、LOD、渐进加载时 |
| `references/examples.md` | 需要完整可粘贴代码时(监控/内存清理/对象池/粒子/R3F 模板/后处理/上下文丢失恢复) |

More from staruhub/ClaudeSkills

SkillDescription
a-share-analystA股分析研究助手,提供行情数据获取与技术面/基本面分析框架(仅供研究参考,不构成投资建议)。适用于:(1) 获取A股行情和历史数据,(2) 技术面分析(K线形态、MACD、KDJ、RSI、布林带等),(3) 基本面分析(财务指标、估值分析),(4) 板块热点追踪,(5) 选股策略筛选与量化因子分析,(6) 生成股市分析报告。当用户询问"帮我分析股票"、"今日选股"、"A股行情分析"、"技术分析"、"量化选股"时触发。不用于:预测明日涨跌或给出确定性买卖指令、代客决策、港股美股(数据源不同)、加密货币。
ai-sales-championAI咨询/销售的对话策略助手。当用户需要准备AI方案沟通、跟业务部门聊AI落地、写AI提案、应对客户异议、做AI培训破冰时使用。触发场景:"怎么跟老板聊AI"、"客户说AI不靠谱"、"准备一个AI方案汇报"、"帮我想想怎么推AI"、"业务部门不配合"、"AI项目怎么卖"、"demo之后怎么跟进"。也适用于AI咨询师、技术合伙人、CTO做内部AI推广。
c-drive-cleanerWindows C盘清理和磁盘空间管理。当用户说C盘满了、磁盘空间不足、清理临时文件/缓存/回收站/系统日志、查找大文件、分析磁盘占用时使用。仅适用于 Windows 环境。不用于:macOS/Linux 磁盘清理、卸载软件(引导用户走系统卸载)、清理用户个人文件(只报告位置,删除决定权在用户)。
deck-studioPPT 生产 Agent:理解场景 → 推荐风格 → 先出大纲 → 定义页面 → 双通路交付(PPT 内容稿 / 逐页视觉图 / 信息图组图)。当用户要做汇报、路演、培训课件、提案、咨询报告的演示文稿,或要把大纲/文章做成 slides、deck、PPT、信息图、小红书图文、可视化传播图时使用。支持指定风格或从风格库推荐,支持 image 模型逐页出视觉稿。前身为 notion-infographic(v2)并吸收 ppt-designer 的设计原则。不用于:pptx 文件的纯技术操作(拆分/合并/提取,用宿主 pptx skill)、演讲稿或文章本体的写作(用 wechat-article-writer)、需要先做研究的内容调研(先走 deep-research 再回来)、单张海报或 logo 设计。
gaokao-expert资深高考命题专家助手,提供专业的命题指导和评审服务。适用于创作高考试题、评审试题质量、分析试卷结构、了解命题趋势等场景。结合文档工具提取解压文件,使用网络搜索了解当年最新命题趋势,使用分析工具评估题目质量和试卷结构。涵盖"一核四层四翼"评价体系、题型规范、评分标准、命题流程等多个维度。不用于:大学/考研/中考命题(体系不同,仅可借鉴)、日常作业题编写、直接替考生解题。
keqian-method胥克谦式AI-Native产品开发方法论。适用于:(1) 使用AI Agent(Claude Code、Codex、Cursor等)进行产品级软件开发,(2) 设计和优化Harness/Skill体系,(3) 文档驱动开发(SDD)流程,(4) 构建自动化质量门禁和eval机制,(5) Token成本优化与缓存策略,(6) 产品人转型开发者的AI编程实践。触发场景包括"帮我设计开发流程"、"怎么降低token成本"、"怎么提高AI编码质量"、"文档驱动"、"质量门禁"、"harness设计"、"单agent vs multi-agent"、"自动化迭代"、"AI产品开发"、"SDD"、"eval机制"等。即使用户只是说"帮我用AI写代码"或"怎么让agent干活更靠谱"也应触发。注意:如果产品是行为开放、用户输入不可穷举的AI-native类型,请改用 xuefeng-method skill。不用于:单个bug修复或小改动(无需方法论)、PRD需求文档写作(用product-manager)。
mineru-pdf-parser用 MinerU 将复杂PDF文档转换为LLM友好的Markdown/JSON格式。适用于:(1) PDF转Markdown/JSON,(2) 提取PDF中的文本、表格、公式、图像,(3) 解析学术论文、技术文档、商业报告,(4) 为RAG应用准备文档数据,(5) 批量处理PDF。触发关键词:"PDF解析"、"PDF转Markdown"、"提取PDF表格/公式"、"MinerU"、"parse PDF"等。不用于:PDF的阅读/填表/签名/拆分合并(用宿主pdf工具)、Word/PPT等非PDF格式解析、只需读几页内容的场景(直接读即可,不必转换)。
pair-programming结对编程搭档。当用户要求"边写边审"、"结对编程"、"写完自己 review 一遍"、"高可靠地实现",或明确希望代码交付时附带自我审查意见时使用。交付代码的同时输出结构化审查(正确性/安全/性能/可读性/健壮性五维度),重点捕捉 AI 生成代码的特有缺陷。不用于:对已有 PR 的正式评审(用 code review 流程)、安全专项扫描(用 security-audit)、10 行以内的简单片段。
podcast-generator用火山引擎 Podcast AI 模型生成中文双人对话播客。当用户要把文章、报告、话题文本转成播客音频、生成对话式音频内容时使用,需要环境具备火山引擎 APP_ID 和 ACCESS_KEY。支持 mp3/ogg_opus/pcm/aac、语速调节、自定义音色、断点续传。不用于:单人朗读式 TTS(用普通语音合成)、英文播客(模型主要优化中文)、播客文稿本身的撰写(先用写作类 skill 产出文本再来)。
product-manager资深产品经理助手,提供PRD文档创作与评审、产品策略咨询、留存增长分析、竞品研究、功能优先级排序等全方位产品管理支持。适用于创作或评审PRD/MRD/BRD/用户故事等产品文档;诊断产品问题(留存低、转化差、增长瓶颈)并给出可执行策略;进行竞品分析和市场研究;设计功能方案和用户体验优化。当用户提到"PRD"、"需求文档"、"产品规划"、"用户留存"、"功能设计"、"竞品分析"、"产品指标"、"增长策略"、"功能优先级"等话题时使用。即使用户没说"产品",讨论App功能设计、用户增长、商业模式时也应触发。不用于:写代码实现功能(开发任务)、系统架构设计(用solution-architect)、需要多源引用的深度市场调研(用deep-research)、纯营销文案撰写。