测试sp.spriteFrame = null似乎没用
DDDDDDDDDdddddD顶顶顶顶
试试看在重新赋值前 拿到上一个spriteFrame的tex 并把tex释放const spf = sp.spriteFrame; sp.spriteFrame = null; const tex = spf.texture; tex.destroy();
图片不显示了。。
这正常呀, 你手动创建纹理,又不走cc.assetManager.assets.get/set 进行缓存与取缓存, 直接不断建texture然后texture.image = ImageAsset 等于webgl不断重复创建纹理, 内存一定是会一直涨的。 估计官方提供这个接口只是为了用来做些简单逻辑, 需要缓存要靠自己
老哥怎么卸掉之前动态创建的呀,老版cocos-js跟unity没写自己删除都是自动管理的,他官方应该在createWithImage是检查之前的没用就该释放掉的吧?
顶顶顶顶顶顶顶顶
尝试半天没写出来
顶呱呱顶呱呱
今天测试把console.log 跟console.error屏蔽掉就好
目前看是log太多的锅
还是不行呀,再家里测试新项目好的,公司环境去掉log换图还是一直涨,难道有什么引擎配置不同造成的? 
我记得动态加载第三方图片挺危险的,比如头像啥的,如果没释放好,内存就泄露了 
目前是bundle内的本地图
一张图片加载成功后存到一个map里面去,下次用到的时候先从map里面取,这样就不会无限上涨了
import { _decorator, Component, Node, resources, ImageAsset } from ‘cc’;
import * as cc from ‘cc’;
const { ccclass, property } = _decorator;@ccclass(‘changeImageTest’)
export class changeImageTest extends Component {
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++) { resources.load("testImage" + 1, ImageAsset, (err, asset) => { this.getComponent(cc.Sprite).getComponent(cc.Sprite).spriteFrame = cc.SpriteFrame.createWithImage(asset); }); } }}
写了个小demo
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,不知道其他资源也要这样操作吗,其实换图把上个卸了就行了,自己做还要考虑热更重置问题还有自带■■回收内存太大给自动回收的问题,算了先这样吧 

