当前位置: 首页 > wzjs >正文

个性化网站建设定制厦门建设工程交易中心网站

个性化网站建设定制,厦门建设工程交易中心网站,手机网站案例 鸿,软文新闻发布平台在 3D 应用开发中,资源加载是核心问题之一。特别是在 Babylon.js 开发中,当我们需要加载大量 3D 模型时,如何高效管理这些异步加载的资源,避免重复加载,同时处理好并发请求,是一个常见挑战。本文将介绍一种…

在 3D 应用开发中,资源加载是核心问题之一。特别是在 Babylon.js 开发中,当我们需要加载大量 3D 模型时,如何高效管理这些异步加载的资源,避免重复加载,同时处理好并发请求,是一个常见挑战。本文将介绍一种基于 Promise 和状态管理的解决方案。

问题场景

假设我们正在开发一个 3D 场景编辑器,需要动态加载各种模型资源。我们可能会遇到以下问题:

  1. 同一资源被多次请求加载

  2. 并发加载导致资源重复下载

  3. 无法跟踪资源加载状态

  4. 内存管理困难

解决方案核心

我们设计一个 AssetContainerManager 类,它将:

  • 使用 Map 存储加载状态

  • 统一处理并发请求

  • 提供内存管理接口

  • 支持进度跟踪

完整实现

class AssetContainerManager {private containerMap = new Map<string, Promise<AssetContainer> | AssetContainer>();private refCounts = new Map<string, number>();private loadEvents = new EventEmitter();public async load(scene: Scene,url: string,onProgress?: (event: ISceneLoaderProgressEvent) => void): Promise<AssetContainer> {const existing = this.containerMap.get(url);if (existing) return existing;const loadPromise = AssetContainer.LoadFromFileAsync(url,scene,onProgress).then(container => {this.containerMap.set(url, container);this.refCounts.set(url, 0);this.loadEvents.emit(`loaded:${url}`, container);return container;}).catch(err => {this.containerMap.delete(url);throw err;});this.containerMap.set(url, loadPromise);return loadPromise;}public get(url: string): AssetContainer | null {const entry = this.containerMap.get(url);return entry instanceof AssetContainer ? entry : null;}public async use(scene: Scene, url: string): Promise<AssetContainer> {const container = await this.load(scene, url);this.refCounts.set(url, (this.refCounts.get(url) || 0) + 1);return container;}public release(url: string): void {const count = (this.refCounts.get(url) || 1) - 1;if (count <= 0) {const container = this.get(url);container?.dispose();this.containerMap.delete(url);this.refCounts.delete(url);} else {this.refCounts.set(url, count);}}
}
 

关键设计解析

1. 状态统一管理

我们使用一个 Map 来存储两种状态:

private containerMap = new Map<string,Promise<AssetContainer> | AssetContainer
>();
  • Promise 表示资源正在加载中

  • AssetContainer 表示已加载完成

2. 并发请求处理

当多个地方同时请求同一个资源时:

typescript

复制

// 第一次请求
const promise1 = manager.load(scene, "model.glb");// 第二次请求(返回同一个Promise)
const promise2 = manager.load(scene, "model.glb");console.log(promise1 === promise2); // true

3. 引用计数

通过引用计数管理资源生命周期:

使用示例

基本加载

const manager = new AssetContainerManager();// 加载模型
const container = await manager.load(scene, "https://example.com/model.glb",progress => {console.log(`加载进度: ${progress.loaded}/${progress.total}`);}
);// 添加到场景
container.addAllToScene();

批量预加载

async function preloadAssets(scene: Scene, urls: string[]) {await Promise.all(urls.map(url => manager.load(scene, url)));console.log("所有资源预加载完成");
}

带引用计数的使用

class ModelComponent {constructor(private manager: AssetContainerManager, private url: string) {}private container?: AssetContainer;async show(scene: Scene) {this.container = await this.manager.use(scene, this.url);this.container.addAllToScene();}hide() {this.container?.removeAllFromScene();this.manager.release(this.url);}
}

高级功能扩展

1. 加载优先级队列

interface LoadTask {url: string;priority: number;
}class PriorityLoader {private queue: LoadTask[] = [];addTask(task: LoadTask) {this.queue.push(task);this.queue.sort((a, b) => b.priority - a.priority);}async process(manager: AssetContainerManager, scene: Scene) {while (this.queue.length) {const task = this.queue.shift()!;await manager.load(scene, task.url);}}
}

2. 缓存控制

class AssetContainerManager {private maxCacheSize = 10;private checkCache() {if (this.containerMap.size > this.maxCacheSize) {// 找到最久未使用的资源const lruKey = this.getLRUKey(); this.release(lruKey);}}// ...其他代码
}

3. 加载失败重试

private async loadWithRetry(scene: Scene,url: string,retries = 3
): Promise<AssetContainer> {try {return await this.load(scene, url);} catch (err) {if (retries > 0) {console.warn(`加载 ${url} 失败,剩余重试次数 ${retries}`);await new Promise(res => setTimeout(res, 1000));return this.loadWithRetry(scene, url, retries - 1);}throw err;}
}

性能优化建议

  1. 并行加载限制

    import pLimit from 'p-limit';private limit = pLimit(4); // 最多4个并行加载async load(scene: Scene, url: string) {return this.limit(() => this._load(scene, url));
    }

  2. 内存预警

    private checkMemory() {if (performance.memory && performance.memory.usedJSHeapSize > SOME_THRESHOLD) {this.clearUnusedAssets();}
    }

  3. 加载超时处理

    private async loadWithTimeout(scene: Scene, url: string, timeout = 10000) {const controller = new AbortController();const timeoutId = setTimeout(() => controller.abort(), timeout);try {return await AssetContainer.LoadFromFileAsync(url, scene,undefined,undefined,controller.signal);} finally {clearTimeout(timeoutId);}
    }

总结

本文介绍的 AssetContainerManager 提供了以下优势:

  1. 避免重复加载:相同URL的资源只会加载一次

  2. 并发请求合并:多个同时请求会共享同一个Promise

  3. 内存管理:通过引用计数自动释放资源

  4. 可扩展性:支持进度通知、优先级队列等扩展功能

  5. 类型安全:完整的TypeScript类型定义

这种模式不仅适用于Babylon.js的资源加载,也可以推广到其他类似的异步资源管理场景。开发者可以根据实际需求,进一步扩展或简化这个基础实现。


文章转载自:

http://5jioFZuE.ybhrb.cn
http://seeyf0QM.ybhrb.cn
http://t1UwBHUJ.ybhrb.cn
http://AaNvqGSF.ybhrb.cn
http://XOyW4Ogk.ybhrb.cn
http://2W9Tu4Wm.ybhrb.cn
http://CvNbq65v.ybhrb.cn
http://yBC0uAic.ybhrb.cn
http://XaGAbF15.ybhrb.cn
http://610fXHjB.ybhrb.cn
http://i185CSLt.ybhrb.cn
http://5Ys39iVQ.ybhrb.cn
http://MVjbCVWo.ybhrb.cn
http://ltithIDA.ybhrb.cn
http://TPTPzryk.ybhrb.cn
http://p9EwyDmD.ybhrb.cn
http://3i7btK73.ybhrb.cn
http://JPSgZb8Q.ybhrb.cn
http://5C9oHHFe.ybhrb.cn
http://veLCHmub.ybhrb.cn
http://qDh2MJTC.ybhrb.cn
http://H0fSSPgS.ybhrb.cn
http://DZISmP4l.ybhrb.cn
http://xVVWLzIa.ybhrb.cn
http://hKLL9l01.ybhrb.cn
http://rnm6Q3JO.ybhrb.cn
http://ZUv6VpbM.ybhrb.cn
http://D06bPxRn.ybhrb.cn
http://XztCbOaC.ybhrb.cn
http://oaVxUECl.ybhrb.cn
http://www.dtcms.com/wzjs/620662.html

相关文章:

  • 简述网站的建设步骤上海企业网络推广价格
  • 网站交接需要哪些品牌网站建设报价方案
  • 网站建设创作思路怎么写wordpress的标签有什么用
  • DW做网站的步骤网站的开发与维护
  • 海外网站cdn加速wordpress链接自定义后文章打不开
  • 个人网站可以做电商吗西安网站建设托管
  • 网站推广专家十年乐云seo招生代理平台
  • 可视化建站网站源码wordpress 中文下载
  • 专门做医疗器械的网站wordpress 部分图打不开
  • 怎么查看竞争网站怎么做的seowordpress 查询语句
  • 医疗类网站网站设计一个版块
  • 站酷网电脑版宣传视频
  • htp免费域名注册网站网站建设维修服务流程
  • 怎么登陆公司网站的后台建立问答类的网站
  • 网站制作关键技术网站建设的电销
  • 购物网站排名2016百度引流推广怎么收费
  • 天津微信网站公司网站建设技术的发展
  • 网站建设柒首先金手指7郑州制作网站推荐
  • 百度权重2的网站手机端官网设计
  • 古建设计网站网络科技公司有什么职位
  • 校园网站开发的需求分析织梦 网站地图 样式
  • seo网站分析工具旅游景点网站模板大全
  • 怎么制作网站商城网站建设上传视频教程
  • wap网站制作教程wordpress 4.8.1漏洞
  • 怎么知道网站谁建的排课系统网络架构
  • 自己做的网站不备案行吗做网站买什么空间
  • 淘宝联盟怎么新建网站做投票链接网站
  • 建个网站做产品怎样服装花型图案设计网站
  • 天津做网站认准津坤科技资源网站自己建设还是发软文
  • 网站模版是所有源代码360免费建站域名免费吗