assetbundle 资源管理思路怎么实现, 什么时候删除assetbundle 合适

分类型吧:
1.永不删除(公共资源)
2.用完就删除(界面相关的,关闭就删除)
3.延迟删除(如果使用频率高,不想马上释放的, 可以不断刷新删除延迟,以达到使用不影响的情况)
4.定时删除(定时检测哪些资源没有使用,且超过一定时限的,比如5分钟检测一次)

界面算使用频率较高的吧

有这种框架吗

建议不要用太通用的框架,自己根据游戏逻辑的需要去分组和删除。
例如,逻辑上要用一个模型 ActorA,这个ActorA的资源就放到bundle “actor_a”里面,那么在ActorManager里面,对ActorA的创建和销毁进行引用计数,以及引用时间。当引用计数归零的时候,定时根据引用时间的超时去释放这个actor_a。
这样不同游戏逻辑用到的不同类型资源组,例如模型,特效,界面这些分类。就可以有不同的管理策略,可以根据项目来细致调配。太通用的框架,不方便配置和细调。

是的,每个项目不一样,只能做个参考

有没有可以参考的案例,可以学习下

bundle 不删除,只卸载bundle内的资源

和unity 的assetbundle 不一样吗,cocos bundle 为啥不删除呢,不占空间? 我现在还没找到一个合适的cocos删除资源的例子

cocos 的 bundle 粒度比 unity 大很多,cocos bundle 是一个文件夹, unity 的 bundle 是一个压缩包。cocos bundle 本身只是一个资源清单,记录文件信息。而 unity 的 bundle 是包括配置资源清单和资源的

意思cocos bundle 没有资源占用, 只有加载asset 的时候才会有占用? cocos加载assetbundel ,不加载资源等于没占用资源? 那大佬有推荐的资料可以学习吗, cocos 资料好难找到合适的案例

不能说没有资源占用吧,只能说维护卸载的收益太小,assetbundle 的配置文件相当于 unity addressable catlog,维护资源卸载的话通过 asset 本身的 addRef 和 deRef 接口来记录资源引用计数,当引用技术变化时,为 0 就卸载了

怎么优雅地回收动态加载的纹理? - Creator 2.x - Cocos中文社区

如果做预加载,是预加载bundle 还是要把bundle 里的asset 再load 一遍? 感觉和unity 的bundle 用法介绍一样,感觉还是不一样, unity 的bundle 占很大资源, 而cocos 的bundle 不用卸载,感觉不占用资源是的

预加载只是加载了配置文件,真正加载资源到内存要通过load,你再仔细读看看文档,资源使用方案各种各样但只要保证decref和addref成对的就差不多了,反正围绕引用系数来构建方案使用资源

楼上都说了bundle就是个资源清单 实在不理解的你就打印一下resources这个内置的bundle

那这样的话,cocos 的bundle 和unity bundle 还是有差别的对吧,cocos 的assetbundle 不用释放吗

怎么感觉还是不理解呢

你构建后看一下 bundle 的结构,非远程的话就是 import/, native/, config.json, index.js 这四个,你 assetManager.loadBundle 只是把 config.json 这个文件加载到内存,实际上 native/ 下的文件都是没有加载的,只有 bundle.load 才会把 native 下的文件加载到内存,所以不用管 bundle 的释放,因为太小了,就 100 个 bundle 可能都没一张图占的内存大,只处理通过 bundle.load 的资源释放就好了,实际上你也不用怎么处理,他自己会根据使用它的节点的销毁而一起销毁,可能不是立即销毁的,但是也无需关心,除非你不想让他随着使用处的销毁而销毁,才需要你来 addRef 和 decRef

1赞

如果我实例化之后, 没有删除实例化的对象, 而删除了asset 会有什么i效果

如果 asset 是图的话就是画面上看不到了,是音频的话就播放不了了,就是资源对象被销毁了,你在使用处加个 2 秒的定时器,执行 asset.destroy() 就知道了