cocos creator 在使用过程中,经常需要动态加载远端资源,比日说 用户头像 ,龙骨动画皮肤资源,这些资源不可能都做成 预制体交给 cocos creator 帮助我们管理;
这个时候就需要我们 动态加载远端资源(但是 动态加载的资源,cocos creator是不会帮我们自动处理的,需要我们在不使用的时候 手动释放,减小内存控件的占用)
官方文档:Cocos Creator 资源管理
cocos creator 动态资源加载:
动态加载用户头像
public static webSprite(path: String) { return new Promise<SpriteFrame>((resolve) => { assetManager.loadRemote(`${path}`, (error, texture) => { if (!error) { let ImgAsset = texture as ImageAsset; let tex = new Texture2D(); tex.image = ImgAsset; let sprite = new SpriteFrame(); sprite.texture = tex; // this.spriteLeft.spriteFrame = sprite; // 添加计数器引用 sprite.addRef(); resolve(sprite); } else { console.log("网络图片加载出错:", error); resolve(null); } }) }); }
cocos creator 动态资源卸载:
页面缓存动态图片的使用:
//记录页面动态加载的图集, 销毁时 释放用 private spriteCacheArray: Array<SpriteFrame>;
使用中途卸载资源:
这里的卸载主要是为了,比如说页面已经关闭了,头像才下载完毕 这个是要 需要现实的 Sprite 已经销毁了,这个时候 直接卸载图片资源!
//clone 是 node 用于显示图片的 prefab Helper.webSprite(data['Users'][i]['Icon']).then(spriteFrame => { //正常显示逻辑 if (this.spriteCacheArray && spriteFrame && clone) { this.spriteCacheArray.push(spriteFrame); clone.getChildByPath('icon_bg/Mask/default').getComponent(Sprite).spriteFrame = spriteFrame; } else { //页面已经销毁了 不存在要显示的 Sprite. 因为是异步操作 所有执行到这里的时候 节点有可能不在了 if (spriteFrame) { spriteFrame.decRef(); assetManager.releaseAsset(spriteFrame); } } });
使用完毕的卸载:
onDestroy() { if (this.spriteCacheArray) { this.spriteCacheArray.forEach(ele => { if (ele) { ele.decRef(); assetManager.releaseAsset(ele); } }); } }