You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化Autodesk Viewer getExternalIdMapping执行速度及过滤几何对象咨询

优化Forge Viewer中基于External ID添加Sprites的性能

1. 避免获取完整映射,按需查询单个External ID

getExternalIdMapping会返回模型所有对象的映射关系,大型模型下必然耗时。如果仅需处理数据库中特定的一批externalIds,直接针对每个ID调用model.findByExternalId()更高效,无需加载全量映射:

// 假设从数据库获取的目标externalIds数组为targetExternalIds
targetExternalIds.forEach(externalId => {
  e.model.findByExternalId(externalId, (dbId) => {
    if (dbId !== null) {
      // 为该dbId添加sprite
      addSpriteToDbId(dbId);
    }
  }, (error) => {
    console.error(`查询externalId ${externalId}失败`, error);
  });
});

2. 过滤映射结果中的几何对象

如果必须获取全量映射,可在拿到结果后只保留几何对象(即叶子节点)。通过model.isLeaf(dbId)判断节点类型,过滤无关的非几何节点:

e.model.getExternalIdMapping(
  (mapping) => {
    // 过滤仅保留几何对象的映射关系
    const filteredMapping = {};
    Object.entries(mapping).forEach(([externalId, dbId]) => {
      if (e.model.isLeaf(dbId)) {
        filteredMapping[externalId] = dbId;
      }
    });
    dispatch(setGuidsAndModels({ model: e.model, guidsToDbids: filteredMapping }));
  },
  (error) => {
    console.error('获取External ID映射失败', error);
  }
);

3. 借鉴ACC的标记显示逻辑优化

ACC能直接显示标记是因为标记数据已和模型关联存储,无需实时计算映射。你可以参考这个思路优化:

  • 提前预计算模型的externalId与dbId映射关系,将其存入你的数据库(可在模型上传到Forge时完成预计算)
  • 模型加载后,直接从数据库读取预存的映射,跳过getExternalIdMapping调用,直接添加sprites

内容的提问来源于stack exchange,提问作者Evhenii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:10:56