Autodesk Viewer在第一人称模式下同时使用SceneBuilder与Minimap3DExtension时出现冻结问题
Autodesk Viewer在第一人称模式下同时使用SceneBuilder与Minimap3DExtension时出现冻结问题
兄弟,我之前也踩过这个坑!当同时用Autodesk.Viewing.SceneBuilder动态添加模型,又开启Autodesk.AEC.Minimap3DExtension的第一人称模式时,Viewer确实很容易出现冻结卡死的情况,折腾了好一阵才摸出几个可行的解决方向,给你参考下:
延迟加载Minimap3DExtension
别在Viewer刚初始化就急着加载Minimap,等SceneBuilder的模型完全加载稳定后再初始化这个扩展。两个扩展同时抢场景资源的概率会低很多,比如在模型加载完成的回调里再启动Minimap:const modelBuilder = await ext.addNewModel({ conserveMemory: false, modelNameOverride: '你的目标模型名称' }); modelBuilder.onLoadComplete = () => { viewer.loadExtension('Autodesk.AEC.Minimap3DExtension') .then(minimapExt => { // 这里再开启第一人称模式 minimapExt.setFirstPersonMode(true); }); };调整SceneBuilder的内存策略
你代码里设置的conserveMemory: false虽然能提升模型加载速度,但会让SceneBuilder占用更多CPU/GPU资源,和Minimap的实时渲染线程冲突概率直线上升。可以先开启内存节约模式,等模型加载完成后再关闭:const modelBuilder = await ext.addNewModel({ conserveMemory: true, // 先开启内存节约减少资源占用 modelNameOverride: '你的目标模型名称' }); modelBuilder.onLoadComplete = () => { // 模型稳定后再关闭内存节约模式 modelBuilder.setConserveMemory(false); // 接着初始化Minimap扩展 viewer.loadExtension('Autodesk.AEC.Minimap3DExtension'); };临时暂停Minimap的实时更新
如果上面的方法还没解决,就在SceneBuilder操作场景的前后,手动暂停和恢复Minimap的更新,避免两个扩展同时修改场景状态:// 先获取已加载的Minimap扩展实例 const minimapExt = viewer.getExtension('Autodesk.AEC.Minimap3DExtension'); // 开始修改场景前暂停更新 if (minimapExt) minimapExt.pauseUpdates(); // 执行你的SceneBuilder操作,比如添加节点、调整模型 await modelBuilder.addNode(yourNodeData); // 操作完成后恢复Minimap更新 if (minimapExt) minimapExt.resumeUpdates();升级Viewer到最新稳定版
老版本的Viewer里这两个扩展的兼容性确实有不少bug,Autodesk在后续版本里修复了很多这类扩展间的资源冲突问题,建议升级到v7及以上的最新稳定版试试。
我当时用第一个延迟加载的方法就解决了问题,你可以先试试这个,要是还不行再逐个排查其他方向~
内容来源于stack exchange
相关产品推荐
相关产品推荐

