不管是从2.x还是3.x,引擎是越来越成熟(至少官方是这样说的)但是内存管理看了那么久依然让人迷糊,测试了下引用计数,但是依然会有关联资源数据不对的问题。不知道是我理解有误还是使用方法有问题,就此官方是不是可以来一个针对各种资源类型内存管理可控的例子?也欢迎有把这块做好的大佬分享下经验。
大抵是没有吧,以前的贴子有人讲了
我试过使用引用计数管理,但似乎只能修改直接引用资源的引用计数,但不会改变间接使用的资源引用计数。所以这个形同虚设。。。
就是啊!一直期待着官方能从底层将这部分问题解决好。不然除了小游戏,中大型游戏真不敢用。
js的问题。。除非gc,不然内存就不会一下子释放
可以不用立马释放掉,但至少再减引用处理好后,再释放时那些已经释放时能够正确释放掉对应资源也成。
这个是会触发的。我2.x试过。
主要是间接减引用没有减少,比如精灵帧我加引用了,那它引用的纹理是不是要加引用啊。不然纹理被释放了这个精灵帧还能用不崩溃吗?
你先弄清楚引用计数是什么
如果是这样 那就是个巨大的BUG了,你出个简单的例子看看
作为一个从2dx时代过来的人,肯定清楚引用计数是什么了。所以先不说再手动释放是是不是能把资源释放下来的问题,至少手动清理不使用资源是所有引用计数为0的资源能被正确得到处理才行吧。
3.x早就做了引用资源的依赖资源引用计数自动增减,2.x才没做
https://docs.cocos.com/creator/manual/zh/asset/release-manager.html#资源的静态引用
这个为什么要加?只在资源加载后和资源引用计数为0的时候才对其依赖资源进行引用计数的加减不就行了吗,每次对使用资源进行加引用再自动对其依赖资源加引用完全没必要,增加不必要的运行逻辑,没有程序思维
那纹理计数没增加先被减扣为0了后,纹理会被释放吗?如果它被释放了,那使用这个纹理的精灵帧还能正常使用吗?
如果被释放了你还能用?就算引用计数被减为0也只会在资源释放检查阶段才会去释放,比如decRef,就会触发资源释放检查。引擎加载的资源引用计数为0也不会去进行释放检查的
这就是问题所在,我使用的纹理产生的精灵帧引用计数保持这,但纹理并没有为此增加计数,所以有可能出现纹理比所用它的精灵帧先为0时。而是当我需要释放时我主动释放时它先被释放的情况,此时精灵帧不久出问题了么?