Cocos Creator 通用框架设计 —— 资源管理

宝爷,场景默认的资源怎么搞,我现在是通过scene的dependAssets字段去建立引用关系,如下:
let scene = cc.director.getScene();
let dependAssets: Array = scene[‘dependAssets’];

但是如果有用到预加载场景的话,这个dependAssets字段是空的。

求指导,谢谢!

preloadScene回调函数获得cc.SceneAsset,获取sceneAsset的uuid,通过uuid获取item,然后走一遍loadRes建立场景资源的引用关系,这样应该可以。

MARK

mark

我下午刚刚把github上面的demo clone 到本地。在看到example_res时发现两个release的代码都是一样的,这样就看不出来resLoader和cc.loader在释放资源时候的区别了啊

mark

关于场景资源建立引用关系的,有兴趣可以看下我这篇文章,有什么问题和建议欢迎大家提出反馈和讨论。

1赞

mark

#mark

mark,感谢宝爷

楼主问你个问题,因为js在资源回收上是有延迟的那么假如a和b都同时依赖资源c,a在释放的时候同时去加载b,此时a依赖的资源还未成功释放但是b加载完成然后a成功释放其依赖的资源这样b不就报错出问题了,所以引用依赖是能计算出资源的释放与否但是由于js的回收延迟的问题会变得很不安全因为你资源释放的动作与真正的结果不是同步的,这个问题楼主有什么好的解决方案吗

js的回收是延迟的,但从缓存列表中移除是实时的,这个资源不在缓存列表中,但是还没有被释放,这种情况也很正常。下次再加载这个资源的时候,就算旧资源还未被回收,只要缓存列表中没有了,就会重新创建一份新的,实际上会有double的资源,这是为了保证正确性,如果类似的操作执行很多次,那么就会有很多相同的资源放到内存中。由js来回收,但游戏中用到的只会有一份。
你就算,不断地去加载/释放同一个资源,也不会有问题。

1赞

mark

v.2.2.2能用么?公司小游戏,新项目要用了,求大佬告知。

可以用,会持续维护和解答问题

我已经在项目中成功使用并且上线了。

战术插眼

葱兄,看了你的代码,我也写了一份场景资源引用,具体可以看ResLoader的构造函数,另外增加了一些实用功能,比如NodePool和ResPool、轻量级的ResKeeper,loadRes后的资源在赋值时可以追踪引用,资源泄露排查辅助工具等等。

宝爷,我这边又看了一下你的代码,是不是一个节点只有在通过ResUtil 的assignWith 或instantiate才能起到这个makeUseKey的作用?

加载回调是异步的,而CacheInfo是加载成功后添加的,极端情况,比如加载很多资源,或差点的手机,还没回调时,我去releaseRes它,那么抱歉,应该是releaseRes无效,但实际是存在这种情况的