优化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
相关产品推荐
相关产品推荐

