預加載是在進入正式場景之前提前加載所需模型、材質、圖片等資源的技術手段,其核心價值在于消除資源加載等待,確保場景首次渲染即可完整呈現,從而提供無縫、流暢的用戶體驗。在復雜的 Web 3D 可視化應用中,資源預加載尤為重要,可有效解決首次加載時的卡頓、白屏及交互延遲等問題。

預加載實現方案
01 基礎實現原理
HT for Web 中所有資源的請求都會經過 ht.Default.convertURL 方法,該方法提供了統一的資源請求入口:
■當返回字符串路徑時,框架會按此路徑發起資源請求;
■當返回 {data: content} 格式對象時,框架會直接使用 content 作為資源內容。
基于此特性,我們可實現預加載機制。
// 資源緩存映射表
let sourceMap = {};
// 判斷是否為本地資源
functionisLocalUrl(url) {
return url.startsWith('data:') || url.startsWith('blob:');
}
// 重寫 convertURL 方法
let oldFunc = ht.Default.convertURL;
ht.Default.convertURL = function(url) {
if (isLocalUrl(url)) return url;
let source = sourceMap[url];
if (source) {
return { data: source };
}
return oldFunc(url);
};
02 資源加載策略
部分資源預加載適用于資源量較大但部分關鍵資源需要優先加載的場景。
// 關鍵資源列表
let resources = [
"models/model.json",
"assets/texture.png",
"symbols/symbols.json"
]

全量資源預加載獲取所有已注冊資源進行預加載:
functiongetAllResources() {
return [
...Object.keys(ht.Default.getImageMap()),
...Object.keys(ht.Default.getCompTypeMap()),
...Object.keys(ht.Default.getShape3dModelMap()),
...Object.keys(ht.Default.getMaterialMap()),
...Object.keys(ht.Default.getHdrTextureMap())
];
}
let allResources = getAllResources();

03 資源加載實現
// 資源類型判斷
const ResourceType = {
IMAGE: /.(png|jpg|gif|jpeg|bmp|svg)$/i,
BUFFER: /.(fbx|gltf|glb)$/i,
HDR: /.hdr$/i,
TGA: /.tga$/i,
JSON: /.json$/i
};
class ResourceLoader {
constructor(resources) {
this.resources = resources;
this.loaded = 0;
}
load() {
this.resources.forEach(url => {
if (ResourceType.BUFFER.test(url)) {
this.loadBuffer(url);
}
else if (ResourceType.IMAGE.test(url)) {
this.loadImage(url);
}
// 其他資源類型處理...
});
}
loadBuffer(url) {
ht.Default.xhrLoad(url, res => {
this.onResourceLoaded(url, res);
}, { responseType: 'arraybuffer' });
}
// 其他加載方法...
onResourceLoaded(url, res) {
sourceMap[url] = res;
this.loaded++;
this.onProgress(this.loaded, this.resources.length);
if (this.loaded === this.resources.length) {
this.onAllLoaded();
}
}
// 加載進度回調
onProgress(loaded, total) {
console.log(`加載進度: ${loaded}/${total}`);
};
onAllLoaded() {
console.log("所有資源預加載完成");
// 進入主場景...
}
}

加載頁面優化
01 進度展示設計
class LoadingView{
constructor() {
this.initView();
}
initView(){
this.dm = new ht.DataModel();
this.view = new ht.graph.GraphView(this.dm);
let style = this.view.getView().style;
style.left = "0";
style.right = "0";
style.top = "0";
style.bottom = "0";
document.body.appendChild(this.view.getView());
}
// 更新進度
updateProgress(percent) {
}
// 移除加載頁面
remove() {
setTimeout(() => {
this.view.getView().remove();
this.enterMainScene();
}, 1);
}
// 進入主場景
enterMainScene(){
}
}
02視覺優化建議
■進度條設計:使用圖標實現平滑動畫。

■背景動畫:添加輕量級背景動畫提升等待體驗。

■分段進度:將加載過程分為資源加載、場景初始化等階段。
■預估時間:基于已加載時間預測剩余時間。
性能優化方案
01 Service Worker 離線緩存
// sw.js
let CACHE_NAME = 'ht-resources-v1';
self.addEventListener('fetch', event => {
event.respondWith(caches.match(event.request).then(function (response) {
if (response !== undefined) {
return response;
} else {
return fetch(event.request).then(function (response) {
if (event.request.url.indexOf('storage') != -1) {
let responseClone = response.clone();
caches.open(CACHE_NAME).then(function (cache) {
cache.put(event.request, responseClone);
});
}
return response;
}).catch(function () {
return caches.match('./');
});
}
}));
});
self.addEventListener('activate', function (event) {
event.waitUntil(clients.claim());
event.waitUntil(
caches.keys().then(function (keyList) {
returnPromise.all(keyList.map(function (key) {
if (key !== CACHE_NAME) {
// 刪除舊緩存
return caches.delete(key);
}
}));
})
);
});
02 資源壓縮策略
■模型優化:輕量化模型,對模型進行減面。
■圖片優化:圖片資源壓縮。
效果對比與總結
01 加載效果對比
預加載方案雖然初始顯示時間較長,但提供了更優的整體用戶體驗:
■完整的場景一次性呈現,避免零碎加載造成的視覺割裂。
■無卡頓的交互體驗,所有資源已就緒。
■可控的等待預期,進度反饋降低用戶焦慮。
■更穩定的性能表現,避免運行時資源加載導致的卡頓。

預加載效果

常規加載效果

02 適用場景
■大型 3D 場景:包含復雜模型和紋理的場景。

■儀表盤應用:需要快速響應的監控系統。
■移動端應用:網絡條件不穩定的環境。
■演示系統:需要流暢演示效果的場合。
03 實施建議
■分階段實施:先對關鍵資源預加載,再逐步擴展。
■性能監控:添加加載時間統計和分析。
■A/B 測試:對比不同策略的實際效果。
綜上所述,本預加載方案能顯著提升 HT for Web 應用的加載性能和用戶體驗,特別適合對流暢性要求高的可視化應用場景。在實際項目中,應根據資源規模和用戶場景靈活調整預加載策略,平衡加載時間和用戶體驗。
圖撲軟件 (Hightopo) 長期專注于 Web 可視化領域,自主研發 HT for Web 2D 和 3D 圖形渲染引擎、低代碼數字孿生組態平臺及相關工具。目前產品已廣泛應用于工業組態、電力能源、孿生工廠、電信機房、智慧交通、智慧城市、園區樓宇、智慧水務、航天軍工等行業領域,為客戶提供可靠的一站式數字孿生解決方案。
審核編輯 黃宇
-
可視化
+關注
關注
1文章
1361瀏覽量
22860 -
數字孿生
+關注
關注
4文章
1676瀏覽量
14008
發布評論請先 登錄
HT for Web 幀動畫 | 3D 動態渲染設計與實現
森林消防智慧預警技術實現:火災監測 Web GIS 可視化平臺搭建
基于圖撲 HT 引擎:數字孿生民航飛聯網方案
基于圖撲 HT 數字孿生 3D 風電場可視化系統實現解析
常見3D打印材料介紹及應用場景分析
圖撲智慧汽車展示平臺全自研技術方案
圖撲邀您相聚 2025 國家工業軟件大會
玩轉 KiCad 3D模型的使用
圖撲軟件 3D 場景預加載應用實現
評論