动态设置图片/头像使用new SpriteFrame() 导致GFX Texture Mem爆

  • Creator 版本: <-- v3.72 -->

  • 目标平台: <-- vsCode谷歌浏览器调试–>

我有一个用户头像需要动态加载,同时会不停的变化头像,使用文档里面的加载方法。

image

这是我自己写的加载玩家头像的方法。

private static headCache: Map<string, ImageAsset> = new Map()

    //设置玩家头像 远程加载的 url xxx.png

    public static setPlayerHeadImg(headImgUrl: string, nodeSp: Sprite) {

        headImgUrl = "https://www.xxx.com/" + headImgUrl

        let findImageAsset = this.headCache.get(headImgUrl)

        if (!findImageAsset) {

            assetManager.loadRemote<ImageAsset>(headImgUrl, (err, imageAsset) => {

                if (err) {

                    GameLogic.error("加载头像失败", err);

                    return;

                }

                this.headCache.set(headImgUrl, imageAsset)

                const spriteFrame = new SpriteFrame();

                const texture = new Texture2D();

                texture.image = imageAsset;

                spriteFrame.texture = texture;

                if (nodeSp.isValid) {

                    nodeSp.spriteFrame = spriteFrame;

                }

            });

        } else {

            const spriteFrame = new SpriteFrame();

            const texture = new Texture2D();

            texture.image = findImageAsset;

            spriteFrame.texture = texture;

            if (nodeSp.isValid) {

                nodeSp.spriteFrame = spriteFrame;

            }

        }

    }

我每次加载一个头像GFX Texture Mem这个会一直递增,最后到达大几千 导致手机显存爆炸 手机卡死。
在手机上运行是发布的web-mobile 在手机网页里面运行

image
刚进入游戏的时候只有60多 玩了一段时间就变成七百多了。

const spriteFrame = new SpriteFrame();

const texture = new Texture2D();

 texture.image = imageAsset;

 spriteFrame.texture = texture;

 if (nodeSp.isValid) {
           nodeSp.spriteFrame = spriteFrame;
    }

就像问一下我给一个精灵赋值spriteFrame ,那之前的是没有销毁吗?

还有假如我不停的给这个精灵赋值同样的图片,纹理缓存也会增加

是的,不會自動銷毀

動態生成的Texture必須自己管理,作法可以參照 https://forum.cocos.org/t/topic/135301

自己加载的资源,需要自己控制释放。