新人对于官方资源释放文档的动态加载图片资源的疑问一个A对象被一个全局对象保存,A对象的引用计算不会加一么?

之前都不addRef()也没出什么问题啊?难道js内存管理和cocoscreator的资源管理的引用计数不是一套东西?
官方文档:资源释放 · Cocos Creator
自己经过下面多位好朋友帮助写了下自己的理解吧做个笔记:

  • 在js内存管理中的规则是:内存中每一个对象都有一个属于自己的引用计数器。当对象A被另一个家伙引用时,A的引用计数器就+1,js不需要重载运算符就能实现引用计数的憎和减;
  • cocoscreator引擎无法对‘=’运算符重载就无法统计出一个对象的引用计数到底是多少;因为是js垃圾回收机制自动管理的,这里有个疑问:其他普通对象的内存管理用js垃圾回收机制管理就行了也就是说资源对象的引用计数也是js在管理的, 但是cocoscreator想精确指导资源对象的释放就只能自己维护一套引用计数,cocoscreator实现了自己的一套资源引用计数的统计和js垃圾回收的引用计数不是一个东西但是并不冲突。

好像是你得new个节点吧图片放上去才自动算一次引用计数吧,用个变量存着应该不行,试试?

你这样解释好像有道理,意思就是说:直接用变量保存texture的引用是无法让texture对象的引用计数加一的;但是我看js的机制是

动态加载方式 文档里有你说的这个规则吗

多出的呢个变量名指引
应该就是你生成带这个资源的节点时自动进行的吧这就是说法不同
下面这个就是相当于让你可以对某些资源在自动释放的情况下还能够自己控制是否在切场景时释放此资源

按照官方文档的说法this.texture = texture用变量保存之后,texture对象的引用计数依然是0 但是我知道在js中是隐式的把引用计数加一, 所以我才觉得js的机制和cocoscreator资源释放机制矛盾了我看不懂了肯定是我知识匮乏哪个部分遗漏了

:sweat_smile:嗯嗯我在多看看

引擎需要自己维护一套引用计数来判断是否加载过某个资源,避免重复加载消耗内存和性能,或者泄露和被js错误回收。

1赞

没有运算符重载机制吧。不像C++

1赞

试一下看看呀又不难

哎呀虽然不知道什么是运算符重载机制,但我感觉问题可能就出在这里

对有道理这个解释 :+1:

你没出问题完全是你的测试场景太简单了,错误的用法也能得到正确的结果。复杂场景会出问题的

1赞

就是它了

嗯嗯 我看到这个官方文档我才明白我之前肯定弄的不对,所以才思考为啥不对的;知识储备不够文档都看不懂!!

所以要么用预制体自动统计,要么用图集,自己去加这个统计完全是找罪受,删个场景多少资源一个个遍历去掉
自己写个计数也行,我之前就是弄了一个场景资源释放都是自己维护的一个计数,没用多个场景,场景好像很占包体大小


1赞

嗯呢 受教了 终于算是解了疑惑 谢谢你谢谢大家