示例
加载远程 jpg 图片,并渲染到 Sprite 时,我们可以考虑采用如下原始没有封装过的代码去实现:
import {
_decorator,
assetManager,
Component,
ImageAsset,
isValid,
Sprite,
SpriteFrame,
Texture2D,
} from "cc";
const { ccclass, property } = _decorator;
@ccclass
export default class TestComponent extends Component {
@property(Sprite)
sprite: Sprite = null!;
protected onEnable(): void {
const url = "https://xxx.jpg";
assetManager.loadRemote<ImageAsset>(
url,
(error: Error | null, imageAsset: ImageAsset) => {
if (error) {
return;
}
if (!isValid(this.node)) {
return;
}
// 创建纹理
const texture = new Texture2D();
texture.image = imageAsset;
// 创建精灵
const spriteFrame = new SpriteFrame();
spriteFrame.texture = texture;
// 渲染
this.sprite.spriteFrame = spriteFrame;
}
);
}
protected onDestroy(): void {
// TODO
}
}
如何释放?
在这个组件销毁时,我们希望能完全释放这个过程中产生的所有资源,那么你认为的最佳代码是?请留下你的最佳实践~
在回答之前,大家可能需要注意的点:
-
上述代码中,存在三个
Asset对象,分别是imageAsset、texture、spriteFrame,你认为他们都需要管理并释放吗,或者只有部分需要管理并释放? -
你是如何释放的呢?直接
destroy()? 通过addRef()和decRef()? 或者其他办法呢? -
如果你通过
addRef()和decRef()管理,那么你还会主动调用texture.destroy()以销毁纹理吗 -
你是否考虑过,
texture可能会在运行时被 动态合图 了?如果你没有注意到这一点,现在可以注意啦,请分别列出texture被合图和没有被合图情况下的资源释放处理。 -
当你编写完代码之后,你是如何验证真的都被释放了?