跳到内容
当前位置:首页>PPT>1 万个物体卡成 PPT?InstancedMesh:从 1 万次绘制到 1 次

1 万个物体卡成 PPT?InstancedMesh:从 1 万次绘制到 1 次

  • 2026-11-02 13:31:28
1 万个物体卡成 PPT?InstancedMesh:从 1 万次绘制到 1 次

一句话导读:复制一万个物体,卡的不是你的电脑,是"喊 1 万次口令"的通信开销。今天用一个 API,把 1 万次绘制压成 1 次。


🎯 开场:一万个方块,帧率从 60 掉到 4

先看一段"看起来很合理"的代码:

for (let i = 0; i < 10000; i++) {  const cube = new THREE.Mesh(geometry, material);  cube.position.set(Math.random() * 100, 0, Math.random() * 100);  scene.add(cube);   // ❌ 一万个 Mesh,一万次绘制命令}

结果:风扇狂转、帧率跌到个位数。

但诡异的是——这 1 万个方块长得一模一样,材质一模一样,几何体也一模一样。GPU 明明最擅长"重复劳动",为什么反而最怕重复?

答案在 CPU 和 GPU 之间的那条窄通道上。

💡 本期核心观点:性能瓶颈很多时候不在"画得慢",而在"喊得太多"——每一句 render 里的绘制命令(draw call)都是一次 CPU→GPU 的口令传递。InstancedMesh 的本质,就是把 1 万次口令变成 1 次。


📖 发生了什么:draw call 才是真凶

Three.js 每一帧要做的事,可以粗暴拆成两半:

[CPU 侧]  遍历场景 → 计算矩阵 → 组装绘制命令(draw call)                    ↓  ← 这条通道又窄又贵(状态切换、数据拷贝)[GPU 侧]  收到命令 → 顶点变换 → 光栅化 → 上色

1 万个 Mesh =1 万次 draw call。CPU 大部分时间花在"排队喊口令"上,GPU 反而闲着。

而 InstancedMesh 的做法是:把"模型长什么样"和"每个复制品摆在哪"拆开。

普通 Mesh:      几何体 + 材质 + 位置   →  一次 draw callInstancedMesh:  几何体 + 材质 + [位置矩阵表 × 10000]  →  还是一次 draw call

一张 GPU 侧的实例矩阵表(instanceMatrix)就装下了所有复制品的位移、旋转、缩放。一份几何体,一份材质,一张表,一次绘制。

方案
物体数
draw call
帧率感受
循环 new Mesh
10,000
10,000
🐌 卡成 PPT
InstancedMesh
10,000
1
🚀 稳满帧

🚀 核心 API:其实只有 4 个方法

const mesh = new THREE.InstancedMesh(geometry, material, COUNT); // ① 声明要画几份mesh.setMatrixAt(i, matrix);      // ② 写第 i 份实例的变换矩阵mesh.setColorAt(i, color);        // ③ 写第 i 份实例的颜色(可选)mesh.instanceMatrix.needsUpdate = true;  // ④ 通知 GPU 更新

就这四个。剩下的全是"怎么算出那个矩阵"的问题。


💻 完整可跑示例:一万个"呼吸方块阵"

零外部依赖(仅需 three),复制粘贴即可运行。效果:一万个彩色方块此起彼伏地上下浮动 + 自转。

import * as THREE from 'three';// ---------- 基础三件套 ----------const scene = new THREE.Scene();scene.background = new THREE.Color(0x0b0f1a);const camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight, 0.1, 500);camera.position.set(0, 45, 90);camera.lookAt(0, 0, 0);const renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(innerWidth, innerHeight);renderer.setPixelRatio(Math.min(devicePixelRatio, 2));document.body.appendChild(renderer.domElement);// 光照(实例化后依然是标准材质,照常吃光照)scene.add(new THREE.HemisphereLight(0xffffff, 0x223344, 1.2));const dir = new THREE.DirectionalLight(0xffffff, 2);dir.position.set(30, 60, 20);scene.add(dir);// ---------- 关键部分:一份几何 + 一份材质 + 一张实例表 ----------const COUNT = 10000;const geometry = new THREE.BoxGeometry(0.6, 0.6, 0.6);const material = new THREE.MeshStandardMaterial({ roughness: 0.35, metalness: 0.1 });const mesh = new THREE.InstancedMesh(geometry, material, COUNT);mesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage);  // 每帧都要改 → 告诉 GPU 别做静态优化// 用一个”临时演员”把 position/rotation/scale 烘焙成矩阵const dummy = new THREE.Object3D();const color = new THREE.Color();const data = [];for (let i = 0; i < COUNT; i++) {  const d = {    x: (Math.random() - 0.5) * 140,    z: (Math.random() - 0.5) * 140,    scale: 0.4 + Math.random() * 1.8,    phase: Math.random() * Math.PI * 2,  };  data.push(d);  dummy.position.set(d.x, 0, d.z);  dummy.scale.setScalar(d.scale);  dummy.updateMatrix();          // ← 少这一步,矩阵全是单位阵,所有方块会叠在一起  mesh.setMatrixAt(i, dummy.matrix);  // 实例级颜色:无需改材质,GPU 侧一张颜色表搞定  mesh.setColorAt(i, color.setHSL(0.55 + Math.random() * 0.25, 0.75, 0.55));}mesh.instanceMatrix.needsUpdate = true;if (mesh.instanceColor) mesh.instanceColor.needsUpdate = true;  // 首次写入后别忘了scene.add(mesh);// ---------- 每帧更新实例矩阵 ----------const clock = new THREE.Clock();renderer.setAnimationLoop(() => {  const t = clock.getElapsedTime();  for (let i = 0; i < COUNT; i++) {    const d = data[i];    dummy.position.set(d.x, Math.sin(t * 1.6 + d.phase) * 3 + 4, d.z);    dummy.rotation.set(0, t * 0.8 + d.phase, 0);    dummy.scale.setScalar(d.scale);    dummy.updateMatrix();    mesh.setMatrixAt(i, dummy.matrix);  }  mesh.instanceMatrix.needsUpdate = true;   // ← 每帧都要置位,否则画面一动不动  renderer.render(scene, camera);});

想立刻感受到差距?把 COUNT 从 10000 改成 100000,用 InstancedMesh 依然能跑;而如果用 for 循环 new Mesh,1 万个就已经开始卡了。


⚠️ 三大高频坑(90% 的人第一次都踩)

坑 1:忘了 needsUpdate = true——"代码没报错,画面没反应"

setMatrixAt / setColorAt 只是在CPU 内存里改数据,GPU 侧那份还是旧的。

  • 首次创建后 → 要置位一次
  • 每帧动态修改后 → 每帧都要置位

最迷惑的是它不报错,你只会看到"一万个方块全叠在原点"或者"动画卡死在第一帧"。

mesh.setMatrixAt(i, dummy.matrix);mesh.instanceMatrix.needsUpdate = true;   // ✅ 改完就通知

坑 2:忘了 dummy.updateMatrix()——所有实例挤成一个点

dummy.position 改了 ≠ dummy.matrix 变了。矩阵是从 position/rotation/scale烘焙出来的,必须手动调用:

dummy.position.set(x, y, z);dummy.updateMatrix();              // ← 千万别漏mesh.setMatrixAt(i, dummy.matrix);

如果图省事,也可以用 mesh.setMatrixAt(i, new THREE.Matrix4().compose(pos, quat, scale)),效果一样。

坑 3:想单独改某一个实例的材质——做不到

10000 个实例共享同一个 Material 对象。你不能只给第 37 号方块换个贴图。

正确姿势分三档:

需求
方案
单独改颜色
✅ setColorAt(i, color),免费
单独改整体缩放/透明度
⚠️ 无法直接做,需自定义 Shader 或 onBeforeCompile
单独换贴图/材质类型
❌ 拆成两个 InstancedMesh,或者退回普通 Mesh

实操心法:能用一个材质表达的差异,就用 instanceColor;表达不了的,就分成几个 InstancedMesh(例如"红色组 + 蓝色组"),依然只有 2 次 draw call。


🎯 顺路收个尾:让一万个物体也能"点得中"

第 9 期我们学了 Raycaster。当时的速查表里埋了一个字段——instanceId。现在可以揭晓了:

renderer.domElement.addEventListener('click', (e) => {  const rect = renderer.domElement.getBoundingClientRect();  pointer.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;  pointer.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;  raycaster.setFromCamera(pointer, camera);  // 注意:实例化物体用 intersectObject(单数),不需要 recursive  const hits = raycaster.intersectObject(mesh);  if (hits.length) {    const id = hits[0].instanceId;    // ← 第几号实例被点中了    mesh.setColorAt(id, new THREE.Color(0xff2e93));    mesh.instanceColor.needsUpdate = true;    console.log('点中了第', id, '号方块');  }});

一万个物体,依然能精确到"第 37 号"——point、face、uv、instanceId 一应俱全。这就是为什么 InstancedMesh 不是"偷懒的降级方案",而是正规的主力方案。


📋 选型速查表:什么时候该用它

方案
draw call
独立动画
独立颜色
典型场景
多个 Mesh
N(多)
✅ 完全自由
✅
物体少于几百个、逻辑各不相同的"主角"
InstancedMesh
1
⚠️ 需逐帧重算矩阵
✅
同款模型 × 成百上千:植被、螺栓阵列、粒子方块
mergeGeometries
 合并
1
❌ 完全静态
❌(烘焙进顶点色)
永远不会动的"死物",如建筑外壳
Points
1
❌ 只有位置
✅(顶点色)
星空、烟尘,不在乎朝向和光照的点

💡 一句话选型:要动 → InstancedMesh;不动 → 合并几何体;只是一个点 → Points。


🧠 深度解读:从"逐个摆件"到"批量复制"的思维转变

这一期表面在讲一个 API,实际在讲一个思维分界线:

  • 初学者思维:场景 = 一堆物体的集合,我一个个 add 进去。
  • 渲染思维:场景 = 一批绘制任务,我按"能不能合并"来组织数据。

一旦你开始用第二种方式看场景,很多性能问题会自己消失:

  • 铝型材框架上的 200 个螺栓孔标记 → 一个 InstancedMesh
  • 草坪上的 5 万根草 → 一个 InstancedMesh + 顶点着色器做风摆
  • 3D 数据看板里的柱状图 → 一个 InstancedMesh,柱子高度写进矩阵
  • 星空/烟花/流星雨(第 20 期会讲)→ 本质是 InstancedMesh 或 Points

这也解释了为什么第 9 期的instanceId值得单独埋一个伏笔——拾取和批量渲染,本来就是同一枚硬币的两面:你用什么方式画,就得用什么方式选。

性能提示:如果实例数以十万计且每帧都在变,CPU 逐帧重算矩阵会成为新瓶颈。进阶做法是把每个实例的"相位/高度"作为instance attribute传进 Shader,让 GPU 自己算动画——这一步我们留到第 19 期 ShaderMaterial 再展开。



🌟 喜欢这篇文章?

3 秒钟做 3 件小事,支持一下:

  1.    ❤️ 点个「在看」,让更多 3D 爱好者看到
  2.    💬 评论区聊聊你被多少 draw call 卡哭过
  3.    📤 转发给那个还在for 循环里 new Mesh 的朋友

你的支持,是我持续更新的动力!🙏

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-11-10 21:41:08 HTTP/1.1 GET : http://h.sjds.net/a/561572.html
  2. 运行时间 : 0.094167s [ 吞吐率:10.62req/s ] 内存消耗:4,499.88kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=1de0fcf306be22d0f6caa62bdbdcb659
  1. /www/wwwroot/h.sjds.net/public/index.php ( 0.79 KB )
  2. /www/wwwroot/h.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /www/wwwroot/h.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /www/wwwroot/h.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /www/wwwroot/h.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /www/wwwroot/h.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /www/wwwroot/h.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /www/wwwroot/h.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /www/wwwroot/h.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /www/wwwroot/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /www/wwwroot/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /www/wwwroot/h.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /www/wwwroot/h.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /www/wwwroot/h.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /www/wwwroot/h.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /www/wwwroot/h.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /www/wwwroot/h.sjds.net/app/provider.php ( 0.19 KB )
  23. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /www/wwwroot/h.sjds.net/app/common.php ( 0.03 KB )
  27. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /www/wwwroot/h.sjds.net/config/app.php ( 0.95 KB )
  30. /www/wwwroot/h.sjds.net/config/cache.php ( 0.78 KB )
  31. /www/wwwroot/h.sjds.net/config/console.php ( 0.23 KB )
  32. /www/wwwroot/h.sjds.net/config/cookie.php ( 0.56 KB )
  33. /www/wwwroot/h.sjds.net/config/database.php ( 2.48 KB )
  34. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /www/wwwroot/h.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /www/wwwroot/h.sjds.net/config/lang.php ( 0.91 KB )
  37. /www/wwwroot/h.sjds.net/config/log.php ( 1.35 KB )
  38. /www/wwwroot/h.sjds.net/config/middleware.php ( 0.19 KB )
  39. /www/wwwroot/h.sjds.net/config/route.php ( 1.89 KB )
  40. /www/wwwroot/h.sjds.net/config/session.php ( 0.57 KB )
  41. /www/wwwroot/h.sjds.net/config/trace.php ( 0.34 KB )
  42. /www/wwwroot/h.sjds.net/config/view.php ( 0.82 KB )
  43. /www/wwwroot/h.sjds.net/app/event.php ( 0.25 KB )
  44. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /www/wwwroot/h.sjds.net/app/service.php ( 0.13 KB )
  46. /www/wwwroot/h.sjds.net/app/AppService.php ( 0.26 KB )
  47. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /www/wwwroot/h.sjds.net/vendor/services.php ( 0.14 KB )
  53. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /www/wwwroot/h.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /www/wwwroot/h.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /www/wwwroot/h.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /www/wwwroot/h.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /www/wwwroot/h.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /www/wwwroot/h.sjds.net/app/Request.php ( 0.09 KB )
  84. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /www/wwwroot/h.sjds.net/app/middleware.php ( 0.25 KB )
  86. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /www/wwwroot/h.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /www/wwwroot/h.sjds.net/route/app.php ( 1.72 KB )
  100. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /www/wwwroot/h.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /www/wwwroot/h.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /www/wwwroot/h.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /www/wwwroot/h.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /www/wwwroot/h.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /www/wwwroot/h.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /www/wwwroot/h.sjds.net/runtime/temp/c1d6e8c94b2c2fa10e259903674c804d.php ( 8.11 KB )
  140. /www/wwwroot/h.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000452s ] mysql:host=172.18.0.4;port=3306;dbname=h_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000701s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000391s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000379s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000709s ]
  6. SELECT * FROM `set` [ RunTime:0.000373s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000811s ]
  8. SELECT * FROM `article` WHERE `id` = 561572 LIMIT 1 [ RunTime:0.000483s ]
  9. UPDATE `article` SET `lasttime` = 1794318068 WHERE `id` = 561572 [ RunTime:0.002104s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000402s ]
  11. SELECT * FROM `article` WHERE `id` < 561572 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000638s ]
  12. SELECT * FROM `article` WHERE `id` > 561572 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000490s ]
  13. SELECT * FROM `article` WHERE `id` < 561572 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001018s ]
  14. SELECT * FROM `article` WHERE `id` < 561572 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000791s ]
  15. SELECT * FROM `article` WHERE `id` < 561572 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000742s ]
0.108792s