3D 场景预加载应用实现 | 图扑软件

news/2025/11/27 19:26:10/文章来源:https://www.cnblogs.com/htdaydayup/p/19279192
此图片的alt属性为空;文件名为640-1-819x1024.png
 

预加载是在进入正式场景之前提前加载所需模型、材质、图片等资源的技术手段,其核心价值在于消除资源加载等待,确保场景首次渲染即可完整呈现,从而提供无缝、流畅的用户体验。在复杂的 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);
};

 

 

资源加载策略

部分资源预加载

适用于资源量较大但部分关键资源需要优先加载的场景。

// 关键资源列表
let resources = ["models/model.json","assets/texture.png","symbols/symbols.json"
]

 

此图片的alt属性为空;文件名为640.gif
 

 

全量资源预加载

获取所有已注册资源进行预加载:

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();

 

此图片的alt属性为空;文件名为640-1.gif
 

 

资源加载实现

// 资源类型判断
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("所有资源预加载完成");// 进入主场景...   
    }
}

 

此图片的alt属性为空;文件名为640-2.gif
 

 

02 加载页面优化

进度展示设计

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() {}
}

 

视觉优化建议

  • 进度条设计:使用图标实现平滑动画。
此图片的alt属性为空;文件名为640-3.gif
 
  • 背景动画:添加轻量级背景动画提升等待体验。
此图片的alt属性为空;文件名为640-4.gif
 
  • 分段进度:将加载过程分为资源加载、场景初始化等阶段。
  • 预估时间:基于已加载时间预测剩余时间。

03 性能优化方案

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);}}));}));
});

资源压缩策略

  • 模型优化:轻量化模型,对模型进行减面。
  • 图片优化:图片资源压缩。

04 效果对比与总结

加载效果对比

预加载方案虽然初始显示时间较长,但提供了更优的整体用户体验:

  • 完整的场景一次性呈现,避免零碎加载造成的视觉割裂。
  • 无卡顿的交互体验,所有资源已就绪。
  • 可控的等待预期,进度反馈降低用户焦虑。
  • 更稳定的性能表现,避免运行时资源加载导致的卡顿。
此图片的alt属性为空;文件名为%E9%A2%84%E5%8A%A0%E8%BD%BD%E6%95%88%E6%9E%9C.gif
 
预加载效果
 
此图片的alt属性为空;文件名为%E5%B8%B8%E8%A7%84%E5%8A%A0%E8%BD%BD%E6%95%88%E6%9E%9C.gif
 
常规加载效果
 
此图片的alt属性为空;文件名为640-1024x676.png
 

适用场景

  • 大型 3D 场景:包含复杂模型和纹理的场景。
此图片的alt属性为空;文件名为640-5.gif
 
  • 仪表盘应用:需要快速响应的监控系统。
  • 移动端应用:网络条件不稳定的环境。
  • 演示系统:需要流畅演示效果的场合。

实施建议

  • 分阶段实施:先对关键资源预加载,再逐步扩展。
  • 性能监控:添加加载时间统计和分析。
  • A/B 测试:对比不同策略的实际效果。

 

总结

综上所述,本预加载方案能显著提升 HT for Web 应用的加载性能和用户体验,特别适合对流畅性要求高的可视化应用场景。在实际项目中,应根据资源规模和用户场景灵活调整预加载策略,平衡加载时间和用户体验。

 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/978897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月GEO公司推荐:全链路破局企业流量困境,AI驱动搜索优化实力全解析

在生成式 AI 重塑搜索生态的浪潮下,AI 搜索与 GEO 优化已成为企业争夺数字流量的核心战略。《2025 中国生成式 AI 搜索生态白皮书》显示,2025 年第三季度相关服务市场规模超 220 亿元,企业采用率同比激增 147%。但行…

CH584/CH585NFC调试相关

在NFC调试中不同线圈对应的匹配参数大概率不一样,刷卡的效果的表现不一。在打板画线圈的时候就要根据沁恒提供的NFC手册及实际版上空间去绘制线圈。绘制线圈的时候要注意线圈的自感要在1-1.5uh左右(计算公式可见手册…

租房买房必看2租房切忌“暗室”!这种房子阴气重、易生病,白送都别住!

2 租房切忌“暗室”!这种房子阴气重、易生病,白送都别住! 2.1 房子便宜是有原因的! 在找房的过程中,你是否遇到过这样的情况: 地段不错,装修尚可,租金却比周边便宜一大截? 这时候请务必警惕!走进屋里看看,是…

人工智能之数据分析 Matplotlib:第二章 Pyplot

人工智能之数据分析 Matplotlib:第二章 Pyplot人工智能之数据分析 Matplotlib 第二章 Pyplot@目录人工智能之数据分析 Matplotlib前言一、导入方式二、基本用法示例1. 绘制简单折线图2. 多条曲线 & 图例3. 散点图…

医疗器械渠道管理革新:数字化平台如何解决行业痛点

医疗器械行业的信息化水平相较其他行业明显滞后,大量业务仍依赖纸质单据、Excel、邮件及散乱的即时通讯工具。这种模式导致流程不可见、无提醒、无追溯,人员投入大却效率低下。在带量采购成为常态的背景下,医疗器械…

性能验证问题汇总

QSPI-Flash启动时,取指速度慢 背景知识:外挂Flash支持通过QSPI接口挂接;支持从QSPI Flash启动;QSPI Flash支持2线、4线读写;直接从Flash取值,速度比较慢,一般通过以下两种方法加速为外挂Flash增加cache 使能QSP…

如何在VSCode中Debug(带有参数,name、program、$file、args、pickArgs、指定虚拟环境)

如何在VSCode中带有参数的Debug(name、program、$file、args、pickArgs、指定虚拟环境) 0. 省流 {"version": "0.2.0","configurations": [{"name": "调试train.py文件…

深入解析:Android Cursor AI实践技巧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C# 中的安全零拷贝

C#中使用Span或者ReadOnlySpan实现安全零拷贝操作英文链接Safe zero-copy operations in C#C# 中的安全零拷贝 Sedat Kapanoglu 塞达特卡帕诺卢 29 Sep 2025 My attempt at talking about one of the most underrated …

适合应届生:零经验专业简历模板TOP4

对于即将踏入职场的应届毕业生而言,最头疼的莫过于“零经验”这一挑战。如何在简历中巧妙展现自身潜力,赢得HR的青睐?选择一款合适的简历制作工具显得尤为重要。 本文将为您盘点值得应届生信赖的四大简历模板工具,…

Proofpoint Satori威胁情报代理正式登陆Microsoft Security Copilot平台

Proofpoint宣布其Satori新兴威胁情报代理正式在Microsoft Security Copilot平台上线。该代理整合了全球分布式传感器网络和第三方威胁数据源,帮助安全团队快速识别被主动利用的漏洞并优先修复,提升基于风险的漏洞管理…

经济学数据如何优化员工体验的技术实践

文章探讨了如何运用经济学数据和科学模型分析员工行为模式,通过数据驱动方法优化人力资源政策,包括保险参与率分析和空间政策影响评估等技术手段。经济学数据如何为更公平的员工体验提供支持 作为全球规模最大、最多…

2025年简约智能家居照明灯品牌推荐,让生活更智能

在现代家居生活中,简约智能家居照明灯已成为提升家居氛围的重要元素。选择可靠的照明灯工厂和优质的供应商,能帮助消费者获得更高性价比的产品。本篇文章将推荐2025年最佳的智能家居照明灯品牌。通过深入分析各大厂家…

AT_fps_24_a お菓子

显然设生成函数 \(F(x)=x+x^3+x^4+x^6\),然后答案就是 \([x^n]F(x)^D\)。 \((x+x^3+x^4+x^6)^D=x^D(1+x^2+x^3+x^5)^D=x^D(1+x^2)^D(1+x^3)^D\)

NOIP 2025 游记(?

NOIP 2025 游记(?以下是博客签名,正文无关 本文来自博客园,作者:Wy_x,转载请在文首注明原文链接:https://www.cnblogs.com/Wy-x/p/19279179 版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许…

[论文阅读] AI | 大语言模型服务框架服务级目标和系统级指标优化研究

[论文阅读] AI | 大语言模型服务框架服务级目标和系统级指标优化研究pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

2025年11月治鼻炎产品推荐:高性价比解决方案与市场热门排行榜

随着环境污染和气候变化加剧,鼻炎已成为影响大众生活质量的常见问题。许多用户在选择治鼻炎产品时面临诸多困惑,包括产品安全性、适用人群、疗效持久性等关键因素。根据行业数据分析,当前鼻炎治疗产品市场呈现多元化…

2025年11月地膜、农膜、塑料薄膜源头厂商最新推荐榜单:三光膜、大棚膜、水池布优质供应商选择指南

随着设施农业的快速发展,农膜、水池布等高分子覆盖材料成为提升作物品质与农业效益的关键。为破解地膜、农用塑料薄膜市场 “品质参差、选品困难” 痛点,本次榜单基于技术创新力、产品效能、地域适配性三大维度,结合…

蓝牙音频协议——安卓开发

协议 AVRCP(Audio Vidoe Remote Control Protocol,音频视频远程控制协议),区分为CT(Control)和TG(Target)两端,TG就是受控端。A2DP(Advenced Audio Distribution Profile,即蓝牙音频传输模型协定),和音频模型一样…