Autodesk Forge加载过多纹理失败挂起及iOS全纹理加载失败问题
问题分析与修复方案:全纹理加载失败时
nextRequest未触发的问题 先明确下你遇到的核心卡点:在iOS设备加载模型时,虽然部分纹理加载失败是已知无需解决的情况,但wgs.js里的逻辑存在边界漏洞——只有当存在成功加载的纹理时,nextRequest才会被调用;如果当前批次的所有纹理都加载失败,这个函数就完全没机会执行,直接导致后续流程卡住。
问题根源拆解
原逻辑的处理应该是这样的:遍历纹理请求时,成功加载的纹理会在处理完后调用nextRequest,失败的纹理仅返回null并跳过,但没有考虑「所有请求都失败」的极端情况——此时没有任何一个成功分支会触发nextRequest,也没有失败分支补位调用,自然就卡住了。
具体修复方案
核心思路是统一统计所有请求的完成状态(无论成功/失败),当全部请求都处理完毕时,强制触发nextRequest,确保流程一定能推进。这里给你一个适配原逻辑的代码修改示例:
// 假设原有的纹理加载遍历逻辑 const totalTextureCount = textures.length; let finishedRequestCount = 0; textures.forEach(texture => { loadTextureResource(texture) .then(loadedTexture => { // 原成功逻辑:处理纹理,返回有效内容 handleLoadedTexture(loadedTexture); markRequestFinished(); }) .catch(error => { // 原失败逻辑:返回null跳过该纹理 console.warn(`纹理加载失败: ${error.message}`); handleFailedTexture(null); // 新增:失败时也要标记请求完成并检查是否触发next markRequestFinished(); }); }); // 新增统一的完成检查函数 function markRequestFinished() { finishedRequestCount++; // 当所有请求都完成(成功+失败),调用nextRequest推进流程 if (finishedRequestCount === totalTextureCount) { nextRequest(); } }
方案说明
这个修改不会改变你原本对「单个纹理失败就跳过」的处理逻辑,只是补全了边界场景的触发条件:
- 单个或部分纹理失败时,成功的请求会逐步触发
markRequestFinished,最后一个请求完成时调用nextRequest; - 所有纹理都失败时,每个失败请求都会触发
markRequestFinished,当计数等于总纹理数时,同样会调用nextRequest,彻底避免流程卡住。
内容的提问来源于stack exchange,提问作者Patrick Kersten
相关产品推荐
相关产品推荐

