修复 SGS SDK 导览数据源与模型加载
升级 SDK API 数据契约,补齐 guideStops、业务 POI、诊断与路线数据接口。 修复 SDK 模式下 POI/模型/楼层混用静态数据的问题,并为 ThreeMap 模型加载增加短退避重试。
This commit is contained in:
@@ -350,6 +350,7 @@ const floorExitConfirmThresholdMultiplier = 1.34
|
||||
const floorExitZoomOutIntentMinDeltaRatio = 0.015
|
||||
const floorExitAccumulatedZoomOutRatio = 0.26
|
||||
const floorExitCandidateHoldMs = 900
|
||||
const modelLoadRetryDelaysMs = [300, 900]
|
||||
|
||||
const syncControlInteractionOptions = () => {
|
||||
if (!controls) return
|
||||
@@ -2165,7 +2166,11 @@ const clearSceneData = () => {
|
||||
clearPoiGroupChildren()
|
||||
}
|
||||
|
||||
const loadModel = (
|
||||
const wait = (delayMs: number) => new Promise<void>((resolve) => {
|
||||
window.setTimeout(resolve, delayMs)
|
||||
})
|
||||
|
||||
const loadModelOnce = (
|
||||
url: string,
|
||||
label: string,
|
||||
loadToken?: number,
|
||||
@@ -2193,6 +2198,41 @@ const loadModel = (
|
||||
)
|
||||
})
|
||||
|
||||
const loadModel = async (
|
||||
url: string,
|
||||
label: string,
|
||||
loadToken?: number,
|
||||
options: LoadModelOptions = {}
|
||||
) => {
|
||||
let lastError: unknown = null
|
||||
|
||||
for (let attempt = 0; attempt <= modelLoadRetryDelaysMs.length; attempt += 1) {
|
||||
if (loadToken !== undefined && !isCurrentModelLoad(loadToken)) {
|
||||
throw createStaleModelLoadError()
|
||||
}
|
||||
|
||||
try {
|
||||
return await loadModelOnce(url, label, loadToken, options)
|
||||
} catch (error) {
|
||||
if (loadToken !== undefined && !isCurrentModelLoad(loadToken)) {
|
||||
throw createStaleModelLoadError()
|
||||
}
|
||||
|
||||
lastError = error
|
||||
const retryDelay = modelLoadRetryDelaysMs[attempt]
|
||||
if (retryDelay === undefined) break
|
||||
|
||||
if (!options.suppressProgress) {
|
||||
setProgress(18, `${label} 加载失败,正在重试 ${attempt + 1}/${modelLoadRetryDelaysMs.length}`)
|
||||
}
|
||||
|
||||
await wait(retryDelay)
|
||||
}
|
||||
}
|
||||
|
||||
throw lastError instanceof Error ? lastError : new Error('模型资源加载失败')
|
||||
}
|
||||
|
||||
const prepareModel = (model: THREE.Object3D) => {
|
||||
model.traverse((child) => {
|
||||
if (child instanceof THREE.Mesh) {
|
||||
|
||||
Reference in New Issue
Block a user