还是释放资源问题

我就直接上图了。上面这两个图是来自官方例子

还没描述完不小心发出去了。第一个图是Canvas模式,第二个是WebGL。每次按钮会调用cc.loader.releaseAll()

但是WebGL会报错

这是什么原因呢

释放了一个还在用的贴图在 web 端就会这样

那正确是释放姿势应该怎么摆啊?

我用cc.loader.loadRes一个prefab,instantiate后加入场景。当我不用了,正确的移除方式需要怎么做?我用cc.loader.release后发现cc.textureCache里面还是有贴图资源。

这个在 API 文档里面有比较详细的介绍

http://cocos.com/docs/creator/api/classes/loader.html#method_release

我刚刚下载了最新的官方例子。发现我上面的贴的代码改成

用release方法了。但是在WebGL环境左右按钮来回点,会出现报错而且在不报错之前cc.textureCache里面还是有两张贴图。

介绍看了。我用最新的版本跑最新的官方例子。都报错~所以不知道怎么用了

用的是这个案例。

我们测试例这里写的确实有问题,我会更新一下,应该是下面这样的:

_clearResource: function (url) {
    this.content.removeAllChildren(true);
    var deps = cc.loader.getDependsRecursively(url);
    cc.loader.release(deps);
}

你用 releaseAll 会报错的原因是释放了还需要使用的背景图片
之前测试例用 release(url) 会报错的原因是:在释放 atlas 资源的时候,只是传递了 url,所以被当作了贴图资源,atlas 并没有被释放,导致重新加载从缓存中直接获取添加到场景中,但是贴图已经不在了,所以报错

1赞

貌似是他用了 loadRes 加载过资源,所以自动禁用了某些资源的 auto release。
而 cc.loader.release(array) 时,借用了 auto release 的实现,所以跳过了那些 loadRes 过的资源………… 导致了 release 无效

我按照你的写法改了案例。


但是来回点两个按钮,但是两个资源图片(gold.png和atlas.png)还是在缓存中。不是应该有一个被释放么

我跟进去过。asset数据是有gold.png的。但是跑到这里来的时候_autoReleaseSetting里面的值=false。所以跳过了释放~

我看到这句话,资源的确是用cc.loader.loadRes加载的。释放的时候如果是用deps的话,就会跑到autoReleaseUtils那边去。所以跳过了。

嗯,是这个原因

那用这个官方案例作为例子,用现在的1.4版本要怎么调用接口才能正确释放

这个跟测试例逻辑有关系,测试例是在重新加载前 release,所以即便 setAutoRelease 设置为自动释放,释放成功后又立即会加载一次。cache 中同时存在两个是正常的

哦。我也被这个测试例子弄晕了。测试例子重新加载0前去释放0…重新加载1前去释放1…


我建议测试例子这样颠倒一下会比较好理解,我加载A前释放B嘛