调用SpriteFrame.createWithImage内存无限上涨的BUG

测试换图内存无限上涨.zip (27.1 KB)

做成示例了

update(deltaTime: number) {
        if (this.isStop) {
            return
        }
        for (let i = 0; i < 100; i++) {
            if (this.cacheImgAsset) {
                this.getComponent(cc.Sprite).getComponent(cc.Sprite).spriteFrame = cc.SpriteFrame.createWithImage(this.cacheImgAsset);

            }
            else {
                resources.load("testImage" + 1, ImageAsset, (err, asset) => {
                    if (!this.cacheImgAsset) {
                        this.cacheImgAsset = asset;
                    }
                    this.getComponent(cc.Sprite).getComponent(cc.Sprite).spriteFrame = cc.SpriteFrame.createWithImage(this.cacheImgAsset);

                });
            }


        }
    }

这么修改也不行,看来就是new Texture的时候上次的图没清掉,又因为再update中换图,又因为destroy是延迟卸载导致无法卸载,直到update停了才会自动卸载?

import { _decorator, Component, Node, resources, ImageAsset } from ‘cc’;
import * as cc from ‘cc’;
const { ccclass, property } = _decorator;

@ccclass(‘changeImageTest’)
export class changeImageTest extends Component {
cacheImgAsset: cc.SpriteFrame
isStop = false;
start() {

    cc.input.on(cc.Input.EventType.KEY_DOWN, (event: cc.EventKeyboard) => {
        switch (event.keyCode) {
            case cc.KeyCode.KEY_A:
                this.isStop = true;
                break;
            default:
                this.isStop = false;
                break;
        }
    }, this);
}
update(deltaTime: number) {
    if (this.isStop) {
        return
    }
    for (let i = 0; i < 100; i++) {
        if (this.cacheImgAsset) {
            this.getComponent(cc.Sprite).getComponent(cc.Sprite).spriteFrame = this.cacheImgAsset;

        }
        else {
            resources.load("testImage" + 1, ImageAsset, (err, asset) => {
                if (!this.cacheImgAsset) {
                    this.cacheImgAsset = cc.SpriteFrame.createWithImage(asset);
                }
                this.getComponent(cc.Sprite).getComponent(cc.Sprite).spriteFrame = this.cacheImgAsset;

            });
        }


    }
}

}

这样缓存似乎可以了

有点锉呀,每次图片都要缓存一下spriteframe,不知道其他资源也要这样操作吗,其实换图把上个卸了就行了,自己做还要考虑热更重置问题还有自带■■回收内存太大给自动回收的问题,算了先这样吧 :expressionless: