Laya资源加载小记 (3)

所有图片下载完成后,解析配置的frames,解析图集内包含的图片信息,为每个图片创建一个Texture,并将Texture放入到loadedMap中,key为图片原始路径。即使图片在图集中,也可以通过设置单张图片的url来获取图片资源。

将图集里所有的图片的url已数组的形式存入atlasmap中,key为图集地址。

if (type === ATLAS) { //处理图集 if (!data.src && !data._setContext) { //@处理.atlas文件 if (!_data) { this._data = data; //构造加载图片信息 if (data.meta && data.meta.image) { //带图片信息的类型 var toloadPics:Array = data.meta.image.split(","); var split:String = _url.indexOf("http://www.likecs.com/") >= 0 ? "http://www.likecs.com/" : "\\"; var idx:int = _url.lastIndexOf(split); var folderPath:String = idx >= 0 ? _url.substr(0, idx + 1) : ""; //idx = _url.indexOf("?"); //var ver:String; //ver = idx >= 0 ? _url.substr(idx) : ""; for (var i:int = 0, len:int = toloadPics.length; i < len; i++) { toloadPics[i] = folderPath + toloadPics[i]; } } else { //不带图片信息 toloadPics = [_url.replace(".json", ".png")]; } //保证图集的正序加载 toloadPics.reverse(); data.toLoads = toloadPics; data.pics = []; } event(Event.PROGRESS, 0.3 + 1 / toloadPics.length * 0.6); return _loadImage(toloadPics.pop()); } else { //处理图片 _data.pics.push(data); if (_data.toLoads.length > 0) { event(Event.PROGRESS, 0.3 + 1 / _data.toLoads.length * 0.6); //有图片未加载 return _loadImage(_data.toLoads.pop()); } var frames:Object = this._data.frames; var cleanUrl:String = this._url.split("?")[0]; var directory:String = (this._data.meta && this._data.meta.prefix) ? this._data.meta.prefix : cleanUrl.substring(0, cleanUrl.lastIndexOf(".")) + "http://www.likecs.com/"; var pics:Array = _data.pics; var atlasURL:String = URL.formatURL(this._url); var map:Array = atlasMap[atlasURL] || (atlasMap[atlasURL] = []); map.dir = directory; var scaleRate:Number = 1; if (this._data.meta && this._data.meta.scale && this._data.meta.scale != 1) { scaleRate = parseFloat(this._data.meta.scale); for (var name:String in frames) { var obj:Object = frames[name];//取对应的图 var tPic:Object = pics[obj.frame.idx ? obj.frame.idx : 0];//是否释放 var url:String = URL.formatURL(directory + name); tPic.scaleRate = scaleRate; cacheRes(url, Texture.create(tPic, obj.frame.x, obj.frame.y, obj.frame.w, obj.frame.h, obj.spriteSourceSize.x, obj.spriteSourceSize.y, obj.sourceSize.w, obj.sourceSize.h)); loadedMap[url].url = url; map.push(url); } }else{ for (name in frames) { obj = frames[name];//取对应的图 tPic = pics[obj.frame.idx ? obj.frame.idx : 0];//是否释放 url = URL.formatURL(directory + name); cacheRes(url, Texture.create(tPic, obj.frame.x, obj.frame.y, obj.frame.w, obj.frame.h, obj.spriteSourceSize.x, obj.spriteSourceSize.y, obj.sourceSize.w, obj.sourceSize.h)); loadedMap[url].url = url; map.push(url); } } delete _data.pics; /*[IF-FLASH]*/ map.sort(); complete(this._data); } 字体资源

Laya有两种字体,一种是TTF字体一种是bitmapfont。

加载bitmapfont是先加载配置文件,再将.fnt改为.png去加载图片。资源都加在完成后,使用BitmapFont去解析图集字体信息。

TTF字体使用TTFLoader去加载,通过根据情况有多种加载方式,有使用FontFace方式,也有通过CSS等方式等。
var tArr:Array = fontPath.split(".ttf")[0].split("http://www.likecs.com/"); fontName = tArr[tArr.length - 1]; if (Browser.window.conch) { _loadConch(); }else if (Browser.window.FontFace) { this._loadWithFontFace() } else { this._loadWithCSS(); }

资源清理方式 /** * 清理指定资源地址的缓存。 * 如果是Texture,则采用引用计数方式销毁,【注意】如果图片本身在自动合集里面(默认图片小于512*512),内存是不能被销毁的,此图片会被大图合集管理器管理 * @param url 资源地址。 * @param forceDispose 是否强制销毁,有些资源是采用引用计数方式销毁,如果forceDispose=true,则忽略引用计数,直接销毁,比如Texture,默认为false */ public static function clearRes(url:String, forceDispose:Boolean = false):void { url = URL.formatURL(url); //删除图集 var arr:Array = getAtlas(url); if (arr) { for (var i:int = 0, n:int = arr.length; i < n; i++) { var resUrl:String = arr[i]; var tex:Texture = getRes(resUrl); delete loadedMap[resUrl]; if (tex) tex.destroy(forceDispose); } arr.length = 0; delete atlasMap[url]; delete loadedMap[url]; } else { var res:* = loadedMap[url]; if (res) { delete loadedMap[url]; if (res is Texture && res.bitmap) Texture(res).destroy(forceDispose); } } } /** * 销毁Texture使用的图片资源,保留texture壳,如果下次渲染的时候,发现texture使用的图片资源不存在,则会自动恢复 * 相比clearRes,clearTextureRes只是清理texture里面使用的图片资源,并不销毁texture,再次使用到的时候会自动恢复图片资源 * 而clearRes会彻底销毁texture,导致不能再使用;clearTextureRes能确保立即销毁图片资源,并且不用担心销毁错误,clearRes则采用引用计数方式销毁 * 【注意】如果图片本身在自动合集里面(默认图片小于512*512),内存是不能被销毁的,此图片被大图合集管理器管理 * @param url 图集地址或者texture地址,比如 Loader.clearTextureRes("res/atlas/comp.atlas"); Loader.clearTextureRes("hall/bg.jpg"); */ public static function clearTextureRes(url:String):void { url = URL.formatURL(url); //删除图集 var arr:Array = Loader.getAtlas(url); var res:* = (arr && arr.length>0) ? Loader.getRes(arr[0]) : Loader.getRes(url); if (res && res.bitmap) { if (Render.isConchApp) { //兼容老版本 if (res.bitmap.source.releaseTexture) { res.bitmap.source.releaseTexture(); } } else if (res.bitmap._atlaser == null) { res.bitmap.releaseResource(true); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzssd.html