引擎版本2.4.8,cc.Label内存无法释放 <有偿解决>

  • Creator 版本: 2.4.8

  • 目标平台: IOS 真机,微信小游戏

  • 重现方式:100%必现

预制体内单独放一个cc.Label,通过cc.resources.load加载预制体并添加,内存有明显增加,然后移除节点并destroy(),cc.resources.release 释放预制体,内存不会降低

运行截图

内存截图

Demo
example.zip (284.1 KB)

个人估计是ccLabel的_canvasPool的原因吧
有缓存最多32张label渲染时的画布 这些画布在ccLabel destory后不会释放
你试试保持40个label的基础上 不停创建摧毁另外40个label试试

图1 是进入游戏内存占用截图
图2 是创建40个静态lable,不做destroy,占用基础canvas后的内存情况
图3 40个大label循环创建销毁,创建…destory…创建…destory,循环创建销毁十次后内存占用情况

代码如下:

  •     if (this.labelpool.length > 0){
    
  •          while (this.labelpool.length > 0) {
    
  •             let element = this.labelpool.pop();
    
  •             element.removeFromParent()
    
  •             element.destroy()
    
  •         }
    
  •     }else{
    
  •         for (let index = 0; index < 40; index++) {
    
  •             let lbnode = new cc.Node()
    
  •             let label = lbnode.addComponent(cc.Label)
    
  •             lbnode.x = 80 + Math.random()*50
    
  •             lbnode.y = index * 40
    
  •             lbnode.anchorX = 0
    
  •             label.horizontalAlign = cc.Label.HorizontalAlign.LEFT
    
  •             label.string = '实例:' + index + 'Cocos Creator 是一款轻量、高效、免费开源的跨平台游戏引擎,同时也是实时3D内容创作平台,不仅支持 2D、3D 的游戏开发,同时在HMI、IoT、XR、虚拟人偶等前沿领域,均可提供一套完善的行业解决方案。Cocos Creator 具备了易于上手的内容生产工作流,以及功能强大的开发者工具套件,可用于实现游戏逻辑和高性能游戏效果,Cocos Creator 也将持续为开发者提供更便捷的创作工具,为合作平台带来可靠的技术解决方案和优质内容供应全球主流商业游戏引擎 Cocos 引擎于2016年推出了第二代编辑器 Cocos Creator,其以内容创作为核心,是一款实现了脚本化、组件化和数据驱动的游戏开发工具Cocos Creator 同步支持 2D、3D 游戏创作,以数据驱动和组件化为核心的游戏开发方式,并在此基础上无缝融合了 Cocos 引擎成熟的 JavaScript API 体系,一方面能够适应 Cocos 系染定制空间,引擎团队彻底重写底层渲染器,'
    
  •             this.node.addChild(lbnode)
    
  •             this.labelpool.push(lbnode)
    
  •         }
    
  •     }
    

按照上述假设,先创建了40个基础label,因为文本内容比较少,基础内存小幅上涨了几M,然后在循环创建销毁另外40个大label,10次后内存涨幅100多M,无法释放掉

超过32个以后不缓存,这部分canvas如何释放,已经缓存的canvas,这部分使用的内存如何清除

试试调用cc.sys.garbageCollect()

cc.sys.garbageCollect() 和 wx.triggerGC() 都有使用

有大佬出面提点一下么 :eyeglasses:

先代码创建 添加 释放ccLabel
排除加载预制资源 释放预制资源的干扰吧

https://forum.cocos.org/t/topic/139397/3?u=bejoseph163

这里就是在单独创建和销毁label

销毁节点前,把 label._frame._texture 销毁试试

QQ截图20220830200209 QQ图片20220830200242

引擎源码这里已经释放,label._frame._texture 就是 label._ttfTexture,截图里this._frame._texture = null是这边修改的,实际没任何效果

这样看来只能等待论坛的大佬解答了, :no_mouth:

:sneezing_face: :sneezing_face:


var count = 1000
var nodeList = []
while(count--){
    var node = new cc.Node()    
    var label = node.addComponent(cc.Label)
    node.parent = cc.Canvas.instance.node
    label.string = Math.random()
    nodeList.push(node)
}

image
image
Native占用的怎么都释放不掉,怪不得占很多内存

这是什么工具

label这块内存真心不知道咋整,折磨好久了。。。

Android Studio Profile看的,用xcode也可以,不过没试过

native ios可以尝试在xcode打断点或输出调试
观察CanvasRenderingContext2D-apple.mm 这个画布的构造/析构情况
观察Texture2D.cpp 这个纹理对象的构造/析构情况
按道理node/label destory后 纹理必然析构 非缓存的画布会析构

它现在非常不讲道理 :fearful:

了解了,目前我们主要上微信,还没做端

目前打算文字全部用char缓存,会节省很多内存,也只用到一个canvas,脚本统一刷字体字色字号,

@zzf_2025 抽空看一下,有解决方案么