新年干货 CocosCreator 开源 UILoader(如何优雅的加载和释放资源) 二

是采用的引用计数来管理资源的。

  1. loadStaticRes 和 releaseStaticRes 是可多次调用的。例如:多个代码分别 load 了一个相同的 static res 意义也不是很大(内存中只会存在一份, 第一次加载出来,后面可以直接从内存中获取) 。只有用户手动 releaseStaticRes 才会被释放(我的理解是 StaticRes 何时被加载 何时 被释放是明确的)。
    2.如果用户自己持有了某个资源,这个资源是会被错误释放的。 只有表面这个是 static res 才不会被释放。(我的理解是 ) static res资源并不会进行引用计数管理。
    3.如果用户自己定义了组件 A,能够关联一些资源到场景中,那组件 A 内部不需要对资源进行 retain/release (在实例化的时候已经retain和release)
    4.说组件 A 的使用者在修改组件 A 关联的资源时,不需要 额外 调用 loadStaticRes 和 releaseStaticRes

多个代码可能是不同人写的。所以如果 release static res 会把别人持有的资源也释放,感觉不是太好。

那 A 关联的资源被设置成 null 时,怎么知道引用计数应该 -1 呢?

如果说 出现这些情况的化。
那 A 关联的资源被设置成 null 时,怎么知道引用计数应该 -1 呢? 也是有办法可以知道这种情况的 两种方式: 第一种 提供一个接口,第二中遍历UI树做出来(有点豪性能)

多个代码可能是不同人写的。所以如果 release static res 会把别人持有的资源也释放,也可以做成引用计数来管理。就可以比卖你这些问题。

当然每个项目总有一些项目的规范和约定。来规范代码风格等等。

谢谢回复。
好像这一套引用计数机制,比较适合处理 Creator 自带组件,对用户的资源处理还支持得不太好?
或者对用户的资源使用,有其它推荐的规范吗?

设计之初的时候 主要针对的 Prefab 来写的。

请教一下,UILoader.js 中的 releaseNodeRes() 方法,在释放资源的时候,把需要释放的资源存储到了 release_key ,释放完 release_key 不就行了吗,为什么还需要用 release_json 来存储,最后再释放 release_json。。。

1赞

三段式释放资源,第一次释放纹理资源, 第二次释放描述纹理的json, 第三次释放描述json的json。

你的帖子已经被社区标记并被临时隐藏。

我觉得吧,不应该让组件直接引用资源,而是让组件引用资源key。加载的时候根据资源key去加载缓存中的资源。另外提供一个资源分组的api。手动释放的时候,不能直接释放资源,而是释放资源组。这样明确了资源加载和释放的分组规则,对用户是友好的;同样也分离了资源和节点之间直接挂钩的关系,我也遇到这个资源和内存管理的问题了,正在看,也不知道这样对不对。关于计数引用,是否需要封装res类和计数引用管理,反正我现在的能力做不到哈,还在继续研究。

var dependAssets = cc.director.getScene().dependAssets; dependAssets报错,不存在这样的方法

cc.director.getScene().dependAssets 如果场景上什么都没有这是一个空数组。 没有你说的报错。 或者就是你自己写错了。

楼主你好,在使用你写的UILoader时遇到一个bug,查了很久认为是你这边实现上有一些问题,目前没有找到比较好的解决办法,提出给你看看你是否有思路解决:

当通过uiloader加载一个prefab后,cocos会自动在cc.loader._cache对象中创建图片纹理的缓存,在使用uiloader.instantiate实例化一个prefab后,会自动对prefab中引用到的纹理资源进行引用计数+1

当通过uiloader.destroy销毁一个节点时,会减少引用计数,如果此时引用计数<=0,则会通过cc.loader.release释放掉纹理。释放后,cc.loader._cache中不再保有这个图片纹理的缓存

但是,但是,此时仅仅释放了纹理texture的资源缓存,并没有释放掉使用这个纹理的精灵帧spriteFrame的缓存。如果此时再次通过cc.loader.instantiate实例化了一个引用了之前释放了的纹理的prefab,cc.loader._cache并不会再次创建图片纹理的缓存!然后uiloader却会尝试去修改引用计数,然后就报错了!

这里我的想法是有没有办法在释放纹理资源的时候同时去释放掉引用到这个纹理的精灵帧。从而确保下一次实例化时,cc.loader._cache重新创建缓存资源的引用

最近我更新以下,是有一点问题。

这个是什么原因

mark…

请问楼主,如果使用creator自带的合图,应该怎么处理?

用2.02版本 creator 运行项目报错 楼主能提供下适配2.02的 demo吗 谢谢楼主分享

已解决

怎么使用这个东西?