思路清奇,连节点都有子父之分,你是连文档都没看过吧,找别人讨论吧
可能是我太笨没看懂,所以我才有此疑问前来请教。那么请问出现我说的上面的情况时,具体是怎么处理的呢?
放心用,我们游戏都上线了,资源加载释放没有问题。游戏算中重度,
直接使用引用计数来管理资源就成么?
这个情况除非你手动去释放了,不然不会出现
我说的就是手动释放的情况,如何去管理那些资源能被释放的问题。
我给精灵帧加了引用后,打印纹理引用计数并没有增加。所以我才有此疑问
我不知道你怎么用的,反正我们项目是直接加载的spriteFrame,正常人也不会去跳过父资源直接去释放子资源,这样做只会出现报错,卡死
一般正常人不都是要持有什么资源都加一个引用计数么,比如某精灵帧。然后再不需要时区减引用计数。再需要释放时手动释放一下。那么如果我持有了精灵帧这个资源,但没有添加对纹理的持有。此时会不会因为纹理计数先到0后,它被手动释放掉了呢?
你加载了资源A,资源A又用到了资源B,引擎自己会给资源B加引用计数
你又一万个地方用到了资源A,给资源A加了一万次引用计数,资源B的计数都不会变
你把资源A的计数减少到0,资源A会自动释放,同时给资源B的计数-1,资源B也就释放了
用引用计数的好处就是,你不需要手动释放
话说你真的有把文档读一次么
也就是说这个方案中对B资源进行操作得小心些才行,如果不小心对B资源减扣到0就会提前释放掉了
你是如何操作能把B资源扣减到0的呢
你如果看不懂文档里的原理,那就不要去管它,你只要记得,你用到了哪个资源,就对哪个资源的计数+1,你不用了就-1,引擎会自己去释放的
间接引用的资源你不用管
或者你换个思路,你游戏控制一下美术量,直接不管内存释放的事情,也不会有事情的
那是不是说,最底层的资源我们都不用考虑,只用考虑直接使用的资源就好。这样就可以做到完美释放
是的————————
搞不懂了
直接在编辑器加了个精灵,设置Frame不设置Atlas(这个spriteframe属于某个atlas),assetManaget.assets里面spriteFrame的refcount是1,atlas不在里面
这时候destory这个精灵,assetManaget.assets里面spriteFrame的refcount还是1
destory精灵并不会操作引用计数,引用计数是要自己去手动操作的
你这个帖子里的东西,文档都描述的很详细。。。。。你还是仔细阅读下比较合适
我之前用加载SpriteAtlas后,用它创建了一个精灵帧,然后我在使用releaseUnusedAssets释放了没使用的资源。然后在用纹理集创建精灵帧就会崩掉,经过你们的解释后,我才知道我理解错了。创建精灵帧并不会将创建它的纹理集的引用增加,只会增加它使用纹理的引用计数。所以释放后,纹理集资源就没了。感谢你们的耐心回复,让我更好的理解了里面的机制。
之前加载精灵集后,通过精灵集获取精灵帧,我就以为精灵集是父资源,所以理解成它创建精灵帧后,精灵集的引用计数会增加。看了大佬你们的讲解后结合数据才发现,我理解错了。感情是精灵集只是管理了精灵帧它们并不是父子关系。再次,再次感谢大佬们的耐心讲解。