# 获取和加载资源
在cocos中,所有继承自cc.Asset类的类型都是资源。 他们有一套统一且自动化的资源管理机制。
* 挂载在场景脚本里预设加载
对于资源文件,我们可以直接在组件脚本中设定资源属性,然后再属性编辑器中,将我们要用到的资源直接拖到对应的属性名下,这样在脚本中我们就可以直接引用我们所需要的资源了。
好处是不用我们再去手动加载,引擎会在进场景之前提前帮我们加载好,拿来即用就好。 缺点就是:只能使用提前预设好的资源,不能灵活变通,无法动态切换。
* 动态加载资源
Creator为我们提供了动态加载资源的接口:cc.loader.loadRes();
// 加载 Prefab
cc.loader.loadRes('assets/prefab', function(err, prefab){
var newNode = cc.instantiate(prefab);
cc.director.getScene().addChild(newNode);
});
// 加载其他资源类似,回调函数第二个参数就是我们需要的资源。
// 加载SpriteFrame时,需要声明第二个参数为资源类型,第三个参数才是回调函数。 例如:
cc.loader.loadRes('assets/textureName', cc.SpriteFrame, function(err, spf){
self.node.getComponent(cc.Sprite).spriteFrame = spf;
});
也可以传入路径为文件夹,进行资源批量加载
// 加载assets目录下所有资源
cc.loader,loadRes('assets', function(err, assets){});
* 直接加载网上资源或设备资源
当我们从服务器请求到玩家头像或者本地上传头像时,我们可以直接用 cc.loader.load() 加载服务器资源或设备资源
cc.loader.load(textureURL, function(err, texture){// texture 就是所需的资源});
**注意** Web应用加载受浏览器同源策略限制,即不可跨域请求。
* 释放资源
在加载完资源之后,所有的资源都会被缓存到cc.loader中,以避免重复加载资源。 当我们认为某份资源不再需要时,便可以释放掉:
// 释放贴图资源
cc.loader.release(texture);
// 释放一个prefab 以及它所有依赖的资源
var deps = cc.loader.getDependsRecursively('prefabs/star');
cc.loader.release(deps);
// 如果在这个 prefab 中有一些和场景其他部分共享的资源,你不希望它们被释放,可以将这个资源从依赖列表中删除
var deps = cc.loader.getDependsRecursively('prefabs/sample');
var index = deps.indexOf(texture2d._uuid);
if (index !== -1) deps.splice(index, 1);
cc.loader.release(deps);
* 防止内存泄漏
最后,一个常犯的新手错误:内存泄漏。 通俗的讲:就是我们在写程序时,自己认为某个资源已经可以释放并且已经释放了之后,由于程序设计或者逻辑不自洽的情况下,这个资源再一次的被请求了。此时垃圾回收还没有开始,那么就意味着这份资源还是会被留在内存中,但是cc.loader已经访问不到了。这是,引擎会重新加载这份资源。那么这样就造成了内存中有两份相同的资源,而在一些递归或者循环中,又有可能在不停的重复着这种操作,最后就有可能导致游戏内存不足而崩溃掉。所以,当我们编程时,一定要仔细检查游戏逻辑,避免上述情况发生。