preloadScene回调函数获得cc.SceneAsset,获取sceneAsset的uuid,通过uuid获取item,然后走一遍loadRes建立场景资源的引用关系,这样应该可以。
MARK
mark
我下午刚刚把github上面的demo clone 到本地。在看到example_res时发现两个release的代码都是一样的,这样就看不出来resLoader和cc.loader在释放资源时候的区别了啊
mark
关于场景资源建立引用关系的,有兴趣可以看下我这篇文章,有什么问题和建议欢迎大家提出反馈和讨论。
mark
#mark
mark,感谢宝爷
楼主问你个问题,因为js在资源回收上是有延迟的那么假如a和b都同时依赖资源c,a在释放的时候同时去加载b,此时a依赖的资源还未成功释放但是b加载完成然后a成功释放其依赖的资源这样b不就报错出问题了,所以引用依赖是能计算出资源的释放与否但是由于js的回收延迟的问题会变得很不安全因为你资源释放的动作与真正的结果不是同步的,这个问题楼主有什么好的解决方案吗
js的回收是延迟的,但从缓存列表中移除是实时的,这个资源不在缓存列表中,但是还没有被释放,这种情况也很正常。下次再加载这个资源的时候,就算旧资源还未被回收,只要缓存列表中没有了,就会重新创建一份新的,实际上会有double的资源,这是为了保证正确性,如果类似的操作执行很多次,那么就会有很多相同的资源放到内存中。由js来回收,但游戏中用到的只会有一份。
你就算,不断地去加载/释放同一个资源,也不会有问题。
mark
v.2.2.2能用么?公司小游戏,新项目要用了,求大佬告知。
可以用,会持续维护和解答问题
我已经在项目中成功使用并且上线了。
战术插眼
葱兄,看了你的代码,我也写了一份场景资源引用,具体可以看ResLoader的构造函数,另外增加了一些实用功能,比如NodePool和ResPool、轻量级的ResKeeper,loadRes后的资源在赋值时可以追踪引用,资源泄露排查辅助工具等等。
宝爷,我这边又看了一下你的代码,是不是一个节点只有在通过ResUtil 的assignWith 或instantiate才能起到这个makeUseKey的作用?
加载回调是异步的,而CacheInfo是加载成功后添加的,极端情况,比如加载很多资源,或差点的手机,还没回调时,我去releaseRes它,那么抱歉,应该是releaseRes无效,但实际是存在这种情况的
楼主很强啊。
不过我想,如果cc.loader.getDependsRecursively可以找到指定资源的所有依赖,cc.loader._cache可以找到当前已加载的所有资源,那么不就可以在每次cc.loader.loadRes的完成回调中调用getDependsRecursively获得当前加载资源的引用,然后去_cache里查找到这个资源的uuid的对象给它的引用计数器累加1(js动态添加这个属性);在释放资源时,依旧通过getDependsRecursively找到其依赖,再去_cache中查找到对应属性,通过检查前面添加的引用计数器来确定是否可以释放该依赖。
这样是不是也可以达到同样目的?
然而这只是个设想,可能在_cache很大且某个资源的引用特别多时会有效率问题。
如果我错了还请指教。