threejs-ops 是一个针对应用与游戏规模的 three.js 开发技能,提供模式化指导:模块设置、资产管线、动画、模拟循环、物理、React 生态,以及在场景复杂度增长时保持高性能且不泄漏内存的方法。
一、用途与范围划分 本技能面向 three.js 应用与游戏:模块、资产、动画、循环、物理、R3F 与规模化。它明确与同系列技能分工,避免重复:创意/生成式 three.js(场景脚手架、GLSL 着色器、粒子、后处理)由 genart-ops 负责;Mapbox GL 自定义图层内的 three.js(CustomLayerInterface、threebox)由 mapbox-ops 负责;着色器层面的 TSL/GLSL 工作属于 genart-ops 领域。
二、ES 模块现实(写任何 script 标签前必读) three.js 仅支持 ES 模块,旧模式已失效,在现代版本上会 404 或静默失败:examples/js/* 非模块加载器(如 js/loaders/GLTFLoader.js、THREE.OrbitControls 全局变量)已在 r148 移除,应改用 three/addons/ 模块导入;build/three.js 与 build/three.min.js 的 UMD 构建(script src + 全局 THREE)已在 r160 移除,应改用通过 import map 或打包器加载 build/three.module.js。 版本命名:npm 发布为 0.<release>.<patch>,例如 three@0.185.1 即 r185;发布按月进行,应锁定精确版本。 无打包器方案(import map):可复制 assets/importmap-starter.html,这是一个完整可运行的起步模板(import map + addons + resize + setAnimationLoop)。核心配置中"three"指向 https://cdn.jsdelivr.net/npm/three@0.185.1/build/three.module.js,"three/addons/"指向同版本的 examples/jsm/。注意:两个条目必须锁定相同版本(版本混用会导致跨模块副本的 instanceof 失败);three/addons/ 键需要结尾斜杠;import map 必须出现在第一个 type="module" 脚本之前。 打包器 vs 无打包器:真实应用/游戏、npm 依赖、物理 WASM、R3F 推荐 Vite(npm create vite@latest);演示、CodePen、教学、现有网站嵌入式页面推荐 import map(零构建)。@dimforge/rapier3d(WASM-bindgen)需要打包器;无打包器时使用 rapier3d-compat。使用打包器时,import { X } from 'three/addons/…' 会通过包的 exports map 解析,两种环境下 specifier 相同。 WebGPU:自 r167 起 three 提供并行构建,可从 three/webgpu 导入 WebGPURenderer,并从 three/tsl 导入 TSL 节点着色语言(import map 用户需将 "three" 键指向 build/three.webgpu.js,它重导出核心,切勿同时加载两者)。WebGPURenderer 会自动回退到 WebGL2 并异步初始化(await renderer.init(),或让 setAnimationLoop 延迟处理)。应用/游戏工作默认仍使用 WebGLRenderer,当需要计算(GPU 人群、粒子模拟)或 TSL 材质时再考虑 WebGPU。
三、GLTF 资产管线 glTF(.glb)是格式。启动时一次性接入三种解码器,以便加载任何优化资产:GLTFLoader、DRACOLoader(解码器路径示例为 gstatic 的 1.5.7)、KTX2Loader(transcoder 路径指向 three 版本的 basis 目录,且必须传入活动的 renderer 调用 detectSupport)、MeshoptDecoder。加载示例使用 await loader.loadAsync('hero.glb') 解构出 scene 与 animations。复制蒙皮角色以实现多个实例时需要 SkeletonUtils.clone(),普通 .clone() 会共享并破坏骨骼。更完整的配置、优化 CLI 配方(gltf-transform、gltfpack)与 CC0 模型来源记录在 references/asset-pipeline.md。
四、动画系统 AnimationMixer 驱动一切(骨骼动画 + 变形目标)。每个模型根一个 mixer,每帧调用 mixer.update(dt)。资料展示了 idle 与 run 两个 clipAction 的 crossFadeTo 平滑过渡(0.3 秒,warp 为 true),并强调不要用 .stop() + .play()。交叉淡入淡出、混合权重、一次性片段、叠加层与变形目标模式见 references/animation.md。
五、游戏循环 渲染走 rAF,当玩法/物理需要确定性时,模拟使用固定时间步。资料给出累加器模式示例:固定步长 FIXED = 1/60,累加并钳制 dt(Math.min((now-last)/1000, 0.1) 以应对切标签页的 dt 尖峰),在 while 循环中执行 simulate(FIXED),并以插值 alpha 渲染。规则包括:使用 renderer.setAnimationLoop(而非裸 rAF,WebXR 必需且可干净暂停);钳制 dt;在 document.hidden(visibilitychange)时暂停模拟;确定性 = 固定步长 + 种子化 RNG + 模拟代码中不使用每帧 Math.random()。完整累加器模式(含渲染插值)、dt 钳制、标签隐藏处理、输入采样与帧率无关阻尼(MathUtils.damp、跟随相机)见 references/game-loop.md。
六、物理 默认使用 @dimforge/rapier3d(Rust/WASM,快速、确定性、活跃开发、内置运动学角色控制器);cannon-es 作为零 WASM 约束下的纯 JS 回退方案。包名陷阱:使用支持 WASM 的打包器(Vite 开箱即用)时用 @dimforge/rapier3d;无打包器/import map 时用 @dimforge/rapier3d-compat(WASM 以 base64 内联,需先 await RAPIER.init())。示例初始化 RAPIER 世界(重力 { x: 0, y: -9.81, z: 0 }),在固定循环内 step,并将 body 的 translation/rotation 复制到 mesh。决策表、初始化模式、刚体/网格同步与角色控制器见 references/physics.md。
七、react-three-fiber + drei R3F v9(React 19)以声明式渲染 three.js 场景图,drei 是其辅助库。适用场景:React 应用、UI 密集、想用 pmndrs 生态(@react-three/rapier、postprocessing);不适用场景:页面无 React、引擎式紧密控制、极简包体。Hooks、常见陷阱(每帧 setState 会拖垮性能,应在 useFrame 中修改 ref)与 drei 清单见 references/r3f-drei.md。
八、规模化模式——保持快速、不泄漏 绘制调用是预算,GPU 内存泄漏是债务,renderer.info 是两者的仪表。相同网格 × N ≥ 约 50 时使用 InstancedMesh(一次绘制调用),通过 setMatrixAt(i, m) 设置矩阵后置 instanceMatrix.needsUpdate = true。关注每帧 renderer.info.render.calls(数百可接受,数千即问题);renderer.info.memory 的 geometries/textures 在销毁后必须回到基线。从场景移除不会释放任何东西——GPU 内存需要显式 geometry.dispose()、material.dispose()、每个纹理的 .dispose(),以及完整销毁时的 renderer.dispose()(SPA 路由切换是经典泄漏点)。资料提供了一个 disposeObject(root) 遍历销毁函数示例。Instancing、LOD、剔除、绘制调用预算与销毁/泄漏纪律见 references/scale-and-disposal.md。
九、环境生命——boids、转向、路点 人群/野生动物/NPC 运动是转向力加空间哈希,由固定循环驱动并通过 InstancedMesh 渲染。Seek/arrive/wander、三条 boids 规则、路点驱动与库选型见 references/actors-and-steering.md;结构化游戏状态构建块(角色运动控制器、路点驱动器、相机装置)可参考 xt4d/GameBlocks。
十、配套资源与校验 捆绑资源包括:references/asset-pipeline.md(加载/优化 GLTF、解码器接线、CC0 模型来源)、references/animation.md、references/game-loop.md、references/physics.md、references/r3f-drei.md、references/scale-and-disposal.md、references/actors-and-steering.md、assets/importmap-starter.html、assets/three-facts.json。另含时效性校验脚本:python3 skills/threejs-ops/scripts/check-three-facts.py --offline 用于结构化检查(无网络,适合 PR CI),--live 用于探测 npm registry(漂移退出码 10,不可达退出码 7),也可配合 --json 与 jq 过滤非 ok 状态项。