性能优化实战:Support Fins 如何把大零件支撑生成从 2.4 秒压到 800ms 以内

发布时间:2026/10/29 5:48:34
性能优化实战:Support Fins 如何把大零件支撑生成从 2.4 秒压到 800ms 以内 【免费下载链接】support-fins项目地址https://gitcode.com/gh_mirrors/su/support-fins点击查看免费下载Support Fins 是一款纯浏览器运行的 3D 打印支撑生成工具把零件斜放它自动生成可撕脱的支撑墙breakaway support fins并直接烘焙进 STL。这篇文章复盘它的性能优化实战——如何用空间网格索引、缓存复用与 Web Worker把大零件支撑生成从 2.4 秒压到 800ms 以内而且输出几何一个三角形都不变。问题定位慢不是三角形多是墙太高优化前团队先做了一件最重要的事用数据定位瓶颈完整记录见 docs/PERFORMANCE-SPEC.md。实测案例是一个平放的flat_bracket.stl约 311×120×192mm只有 2,048 个三角形平放姿态糟糕朝向构建约2.4s产出 16 面支撑墙 / 576 个 tines同样零件放到 45°好朝向约 60–100ms只有 9 面墙。结论很清晰慢的根源不是网格面数而是糟糕朝向让零件站出十几面高墙每面墙的探测成本随墙高线性增长。按函数拆解的耗时平放姿态步骤实测耗时调用量insidePart点内测试~240ms约 128 万次nearestPart最近面查询~240ms约 28 万次stationCertified焊接校验~230ms—stationIsClear通路校验~200ms—surfaceZAt表面高度查询~32ms约 11 万次床板垫 tines合计~450ms—优化一空间网格索引只查格子里的三角形insidePart判断一个点是否落在零件内部被调用 128 万次是最典型的高频小查询。暴力法每次都要扫全网格成本 O(n)解法是桶状空间网格bucket gridweb/inside.js 把每个三角形按其 (y, z) 范围分桶点查询只扫对应列的三角形数据结构用 CSR扁平Int32Array避免每格一个小数组的分配开销网格规模不再拍脑袋web/gridsize.js 按面数定格——目标约每格 1 个面边长不小于 64 格兼容旧行为、单格不小于 0.5mm。这一条有真实事故背书25 万面、768mm 的大模型用固定 64×64 网格时平均每格塞进约 60 个三角形这些扫描占了整个 Auto 构建的~80%197 秒网格按面数自适应后同量级的查询从扫半张网格变成扫一格。优化二索引只建一次每次旋转都复用3D 打印工具里用户最爱做的操作就是旋转零件而加速结构最怕重建。Support Fins 的做法是两条军规网格在零件的原始坐标系里构建永远不在旋转后的坐标系建。旋转不改变哪些三角形存在、彼此如何相邻所以同一文件的所有朝向共享同一份索引旋转只做矩阵变换绝不烘焙进几何。没有浮点误差累积原始文件永远可恢复。收益在 docs/ROADMAP.md 里写得很直白焊接weld判定只算一次28–119ms旋转后只重跑线性分类通道1–6ms这就是读取数值能在拖拽时实时刷新的原因。web/prop/surface.js 里的surfaceZAt网格则用WeakMap缓存在三角形数组上——同一次构建里对同一数组发出的大量查询只付一次 O(n) 构建成本。优化三两级网格大盒子查询走粗网格点查询需要细但一面墙三角形的外接盒子扫哪些格子这种大盒子查询在细网格上会跨越数千个格子——一次这样的遍历就占掉某个 512mm 模型构建的一半时间。解法是 web/inside.js 中的两级网格细网格按面数自适应供点和小盒子查询另存一份固定 64×64 的coarse粗网格专门服务solidClearance的大盒子查询。细查细用、粗查粗用互不拖累。优化四Web Worker 让 UI 永不冻结算得快之外还要不卡。buildFins及其整条 import 链web/prop.js 及 web/prop/ 下的各模块、web/inside.js刻意保持纯网格数学、无 DOM 依赖因此整个构建可以原封不动搬进 Workerweb/finworker.js主线程把拓扑、分析结果、朝向、选项 post 过去算完把三角形 post 回来期间旋转、按钮、滑杆全部照常响应滑杆输入做了去抖姿态变化时丢弃进行中的旧构建避免排队等一个已经不需要的结果Worker 异常时主线程回退到内联构建用户永远不会没有支撑可用。优化五先测量后动手最容易被忽视的一条经验约 60% 的耗时最初无法归属到任何具名函数——它散落在循环控制、数组分配等 JS 内联开销里。团队的做法是给函数改名包计时把export function foo改成内部函数再导出一个计时包装先把这 60% 归属清楚再按安全性 × 收益排序选策略而不是一上来就堆 micro-optimization。docs/PERFORMANCE-SPEC.md 里的候选策略排序本身就是很好的方法论示范粗粒度早停墙的整体走廊若确证为空则跳过逐站走查 合并两次全高遍历 Worker 池并行 内循环微优化而降低探针密度被列为最后手段——那些 1.0mm 站点步长背后有真实的焊接回归史。如何保证更快但输出一个三角形都不变性能优化的最大风险是把输出改坏了。这个项目的硬约束是fin / tine / 三角形数量必须不变水密性必须不变用三层护栏验证单元测试deno test --allow-read tests/全绿才算通过压力矩阵21 种形状 × 7 种朝向共 147 例结果固定在 prototype/stress/RESULTS.mdGolden 文件tests/golden/ 下的固定输入快照如cube-x40-auto.json改完代码逐一比对。新手能带走的 5 条经验先 profile 再优化知道 60% 时间花在哪比写出 10 个 micro-optimization 更有用高频点查询配空间索引桶网格 CSR 扁平数组是纯 JS 里性价比最高的加速手段索引绑定在不变的坐标系上让用户最常用的操作旋转零成本复用缓存把重计算搬进 Web Worker纯函数模块无 DOM 依赖是进 Worker 的前提用输出指纹当回归测试数量、水密性、golden 快照让提速和改坏行为永远分得开。延伸阅读性能规格与复现步骤docs/PERFORMANCE-SPEC.md网格规模策略web/gridsize.js空间索引实现web/inside.js表面高度查询缓存web/prop/surface.jsWorker 构建流程web/finworker.js压力测试结果prototype/stress/RESULTS.md每面墙的判定逻辑web/prop/clearance.js赞分享【免费下载链接】support-fins项目地址https://gitcode.com/gh_mirrors/su/support-fins点击查看免费下载相关推荐零安装、零上传Support Fins 如何在浏览器里免费为 STL 生成可折断支撑鳍片零安装、零上传Support Fins 如何在浏览器里免费为 STL 生成可折断支撑鳍片 Support Fins 是一款免费的开源 3D 打印支撑生成工具Onshape 原生 FeatureScript 集成如何在 CAD 里直接用 Support Fins 添加 B-rep 支撑鳍片Onshape 原生 FeatureScript 集成如何在 CAD 里直接用 Support Fins 添加 B rep 支撑鳍片 Support Fins高瘦零件总漂移Support Fins 的 Sway braces 摇摆支撑原理与实战设置高瘦零件总漂移Support Fins 的 Sway braces 摇摆支撑原理与实战设置 Support Fins 是一款在浏览器里为 3D 打印零件自动创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询