搜索
博主信息
博文 57
粉丝 7
评论 11
访问量 269704
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Creator3.x加载远程图片(微信头像)
樂成的开发笔记
原创
3330人浏览过

项目中要展示用户微信头像

类: AssetManager

方法loadRemote 使用 url 加载远程资源,例如音频,图片,文本等等。

1、自定义一个cache对象,用来存放 ImageAsset 和 SpriteFrame 的映射关系;

cache: { [name: string]: SpriteFrame } = {};

2、loadRemote 回调中,首先检查该 ImageAsset 是否已有对应的 SpriteFrame,有则直接用,没有则创建一个新的 SpriteFrame 和 Texture2D,然后计数加1;

assetManager.loadRemote<ImageAsset>(url, (err, imageAsset) => {    
    if (!err && imageAsset) {        
        let spFrame = this.cache[imageAsset._uuid];        
        if (!spFrame) {            
            const texture = new Texture2D();
            texture.image = imageAsset;
            spFrame = new SpriteFrame();
            spFrame.texture = texture;
            imageAsset.addRef();            
            this.cache[imageAsset._uuid] = spFrame; // 添加映射表记录
        }
        spFrame.addRef(); // 计数加1
    }
});

这样,对于N个相同资源,只会创建一份 ImageAsset、Texture2D 和 SpriteFrame,其中 SpriteFrame 的引用计数为N;

3、释放时,手动调用 SpriteFrame.decRef,然后判断引用计数,如果为0,则同时释放 ImageAsset 和 Texture2D,并从映射表里删除该 SpriteFrame 的记录。参考资料

releaseRemoteSprite(node: Node) {
    if (!isValid(node)) {
        return;
    }
    const sp = node.getComponent(Sprite) as Sprite;
    if (sp && sp.spriteFrame) {
        const spFrame = sp.spriteFrame;
        sp.spriteFrame.decRef(false); // 只把计数减1
        sp.spriteFrame = null;
		
        if (spFrame.refCount <= 0) {
            let texture = spFrame.texture as Texture2D;
            // 如果已加入动态合图,必须取原始的Texture2D
            if (spFrame.packable) {
                texture = spFrame.original?._texture as Texture2D;
            }
            if (texture) {
                delete this.cache[texture.image!._uuid]; // 删除映射表记录
                texture.image?.decRef();
                texture.destroy();
            }
			spFrame.destroy();
        }
    }
}


综合以上资料,由于我只需要微信头像,所以简单获取节点更新一下图片,暂不知道有什么影响

微信头像已下载至服务器本地

修改代码如下:

if(userInfo['head'] != ''){
	let url = userInfo['head'];
	assetManager.loadRemote<ImageAsset>(url, (err, imageAsset) => {
		if (!err && imageAsset) {
			let spFrame = this.cache[imageAsset._uuid];
			if (!spFrame) {
				const texture = new Texture2D();
				texture.image = imageAsset;
				spFrame = new SpriteFrame();
				spFrame.texture = texture;
				//节点路径
				let head = cc.find('Canvas/index/ShowUser/set_bg/user_bg/head/SpriteSplash/Mask/Sprite')
				head.getComponent(cc.Sprite).spriteFrame = spFrame
				imageAsset.addRef();
				this.cache[imageAsset._uuid] = spFrame; // 添加映射表记录
			}
			spFrame.addRef(); // 计数加1
		}
	});
}

微信图片_20220927112913.png

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学