Label一处可能的纹理泄漏

一个组件的onDestroy只有在真正的enable一次之后,才会被调用。
cc.Label中,如果在非enabled状态调用了_updateRenderData(true),那就会创建出_ttfTexture。如果此label并不被enable,而直接destroy,就会产生泄漏。需要在cc.Label中加上

_onPreDestroy () {
    if (this._ttfTexture) {
        this._ttfTexture.destroy();
        this._ttfTexture = null;
    }
    cc.RenderComponent.prototype._onPreDestroy.call(this);
},

我验证下

不晓得有没有关系https://forum.cocos.org/t/richtext/84904/4

请问你这里所反馈的问题对应是哪个版本的 CocosCreator 引擎?

应该是两个版本都有 2.1.2和2.2.0
我目前在2.1.2上出现过。
从代码来看,不调_updateRenderData(true)应该不会泄漏。

在 2.1.2 版本,不执行 _updateRenderData(true) 的话,也就不会产生有效的 _ttfTexture。所以就不会有任何渲染产生。
想了解一下你是如何测试出来内存泄漏的。因为目前 CCLabel 在销毁时不管组件是否 enable ,只要 _ttfTexture 不为空,那么就会销毁它。
下方代码,2.1.2 与 2.2.0 一致。

问题是组件的onDestroy并不一定会被调用啊
我写个测试代码试一下

window.setTimeout(function () {
    var label = new cc.Node().addComponent(cc.Label);
    label.string = "hello, world";
    label._updateRenderData(true);
    label.node.active = false;
    label.node.parent = cc.director.getScene();
    window.setTimeout(function () {
        label.node.destroy();
    }, 1000);
}, 5000);

你确定这种情况下组件的 onDestroy 不会调用?

很确定
组件只有自身的节点在场景树中可见过,并且组件是enabled的,才会调用一次onLoad, 有onLoad才会有onDestroy.
以前我验证过的。
你可以试一下。

1赞

那确实!

多谢反馈,2.2版本的_updateRenderData(true)修改为了_forceUpdateRenderData(),原本这个是一个内部使用的API,但是有些用户有需求需要立即获得修改后的节点size才会使用,其实在onEnable的时候是会调用_updateRenderData(true)的,所以这里的手动调用也没有必要,引擎层面在后续版本补充完善下,谢谢!

需要_updateRenderData(true)和_forceUpdateRenderData()来计算文字大小,这个还是很重要。

1赞

确实经常需要立即更新节点size,所以建议 将这个改成公开的API。