各位大佬有没有发现ccc挂载的资源,包括自定义的UI还是预制体,只要是挂载的资源,不管是音效,图片,特效等都不会随着UI和预制体的销毁而释放.然后就一直暂用内存
那么啥时候释放呢,只有在场景勾选了自动释放后,游戏中触发切换场景也就是cc.director.loadScene才会释放挂载的资源,这就是所谓的自动释放.
假如你挂载的资源越多,那占用的内存就越大,如果游戏整个游戏过程没有触发cc.director.loadScene,那就约容易造成OOM
当然这个是我自己观察感觉是这样的,如果有大佬指点一二,不胜感激
纹理/音效这种资源整个场景生命周期都在使用,就是应该要缓存起来的啊,场景切换再考虑释放。需要精细控制,可以手动控制了
重点是挂载,难道就由他不释放,难道永不挂载么,那还要什么可视即可得
你的意思是节点/组件释放掉就应该把纹理资源释放掉?这咋可能?
自动合批,把很多小图合并起来,多个节点/组件都在用同一个资源。
一旦上传到GPU,整个场景都存在,不带考虑释放的。
你加载的预制体,node.destroy销毁的是实例化占用的内存。还要把缓存释放了
我就拿我自己的例子解释下整个过程吧:
1.在ccc里创建了预制体,预制体里挂载了各种图片,比如背景图片,spine等,然后挂上脚本(很正常的操作吧)
2.然后代码上通过动态加载,把预制体加载了,然后const xxNode = cc.instantiate(xxPrefab),实例化,并把node.parent = this.node;这也没问题吧
3.当关闭这个预制体对象,调用xxNode.destroy()后,预制上所有的挂载资源(背景图片,spine等)都不会随着这个destroy而释放,然后就一直占用内存了.
假如你通过预制体instantiate了两个对象,就叫他们俩怪物双胞胎吧,其中怪物哥哥被你打死了,所以只把哥哥destory掉,但是兄弟还活着啊,照你的意思destory哥哥的时候资源要释放,那怪物弟弟死的是不是有点冤
先搞定一个小问题:一个复杂的界面,你第一次打开很慢,第二次就很快。这是为什么
nonono,就算你把俩怪物双胞胎都打死,都destory,资源也是不会被释放的,这个才是重点
大概能理解楼主的意思,但是这种大多都是自己手动释放的
不然你想一个场景:打死了怪物A,删除时遍历资源查找是否有持有,没有持有的话就直接卸载掉资源,那再生成怪物A的话是不是需要再加载一次资源?
这不就违背了进场景时先预加载场景所需资源的初衷?这样的话再次生成怪物A的时候岂不是会卡一下?
而切换场景时会认为当前所有未被持有的资源都不再需要,新场景需要预加载的资源多是在load页面自行再加载,这种设计玩家体验感会好很多吧