API文档参考:http://doc.starling-framework.org/core/starling/utils/AssetManager.html

项目想以不改动starling的情况下对某些功能扩展,为的是方便starling升级后可直接替换, 之前写了个GAssetsMgr 接管了 纹理加载,方便文件缓存。还有一个问题是这个管理类是单一队列,并且只给外部传一个进度信息 loadQueue(onProgress), 当不断地往队列里加任务时,纹理回调会被明显推迟。于是想在尽量少改动的前提下实现分批次回调。

改造后,实际调用如下:

GAssetsMgr.getInstance().enqueue( _ImagePath, _XMLPath ).progress = OnAssetsLoadProgress;
GAssetsMgr.getInstance().loadQueue( null );

GAssetsMgr 并不是直接继承AssetManager, 内建一个AssetManager的变量

        private static const LOADING:int=0;
private static const LOADED:int=1;
private var _loadDic:Dictionary;
private var _enqueue:Vector.<Object>;
private var _enqueueList:Vector.<EnqueueNorm>;
private var _starlingAMgr:AssetManager;
private static var _instance:GAssetsMgr;

定义一封装批次的类, 每更新资源列表时往外传递批次进度

class EnqueueNorm
{
private var _progress:Function;
public var enqueue:Vector.<Object> = new Vector.<Object>;
private var _len:int=-1; public function set progress($fun:Function):void
{
if(0 == enqueue.length) $fun(1);
else _progress = $fun;
} public function appendEnqueueObj($obj:Object):void
{
enqueue.push($obj);
} public function completeSource($name:String):Boolean
{
var isComplete:Boolean=false;
if(-1 == _len) _len = enqueue.length; for (var i:int=0; i < enqueue.length; i++)
{
if($name == enqueue[i].name)
{
enqueue.splice(i,0);
break;
}
} if(enqueue.length > 0)
{
if(null != _progress) _progress((_len - enqueue.length)/_len);
}
else
{
if(null != _progress) _progress(1);
isComplete = true;
_progress = null;
} return isComplete;
}
}

每次封装一个批次,并避免重复加载

        public function enqueue(...rawAssets):EnqueueNorm
{
var objects:Array =[];
var rawAsset:Object;
var eqn:EnqueueNorm = new EnqueueNorm;
_enqueueList.push(eqn);
if(rawAsset is Array)
{
enqueue.apply(this, rawAsset);
}
else
{
for each( rawAsset in rawAssets)
{
if(rawAsset is Array) enqueue.apply(this, rawAsset);
else if(rawAsset is String) push2Queue(String(rawAsset), eqn);
else objects.push(rawAsset);
} if(objects.length > 0) _starlingAMgr.enqueue(objects);
}
return eqn;
} private function push2Queue($rawAsset:String, $enqueueNorm:EnqueueNorm=null):void
{
var obj:Object = {asset:$rawAsset, name:getName($rawAsset)};
if(LOADED != _loadDic[$rawAsset] && null != $enqueueNorm) $enqueueNorm.appendEnqueueObj(obj); if(null == _loadDic[$rawAsset])
{
_enqueue.push(obj); _loadDic[$rawAsset] = LOADING;
}
}

每加载完一个资源时从各个批次的资源列表里删除引用

            function resume():void
{
if(null != currentAssetInfo) completeSource(currentAssetInfo);
...
}
        private function completeSource($assetObj:Object):void
{
_loadDic[$assetObj.asset] = LOADED; var eqn:EnqueueNorm;
var i:int=0;
for (; i < _enqueueList.length; i++)
{
eqn = _enqueueList[i] as EnqueueNorm;
if(eqn.completeSource($assetObj.name))
{
_enqueueList.splice(i,1);
i--;
}
}
}

so Enjoy it!

简单改造 starling 中的 AssetManager 让其更适合 批次加载纹理的更多相关文章

  1. Cesium中Clock控件及时间序列瓦片动态加载

    前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrellis相结合.Cesium的强大之处也在于其 ...

  2. 一个简单的适用于Vue的下拉刷新,触底加载组件

    一个简单的适用于Vue的上拉刷新,触底加载组件,没有发布npm需要时直接粘贴定制修改即可 <template> <div class="list-warp-template ...

  3. Tomcat中的类是怎么被一步步加载的?

    了解Tomcat的类加载机制,原来一切是这么的简单. 一.类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载不同的类.当用 ...

  4. jQuery中的ready方法及实现按需加载css,js

    模拟jQuery中的ready方法及实现按需加载css,js 一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的 ...

  5. Prism框架中加载类库中时其中第三方类dll提示无法加载程序集

    Prism框架是采用一种依赖注入的方式动态加载程序集,能够在程序需要加载的时候将程序集注入到里面去,实现程序的热插拔效果,而且采用这种框架能够让我们进行一个大项目的独立开发,在最近的一个项目中在独立开 ...

  6. 模拟jQuery中的ready方法及实现按需加载css,js实例代码

    这篇文章介绍了模拟jQuery中的ready方法及实现按需加载css,js实例代码,有需要的朋友可以参考一下     一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候 ...

  7. cocos2d-x lua中实现异步加载纹理

    原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的 ...

  8. Vue中结合Flask与Node.JS的异步加载功能实现文章的分页效果

    你好!欢迎阅读我的博文,你可以跳转到我的个人博客网站,会有更好的排版效果和功能. 此外,本篇博文为本人Pushy原创,如需转载请注明出处:http://blog.pushy.site/posts/15 ...

  9. nginx中有关命令和日志切割,配置文件加载的详细阐述

    一.Nginx简介 Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器.Nginx 已经在俄罗斯最大的门户网站── Ram ...

随机推荐

  1. cocos2d-x CCSpriteBatchNode

    转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019880.html 1.先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一 ...

  2. HDU 5074 Hatsune Miku(DP)

    Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan and C ...

  3. 中国大概能用的NTPserver地址

    133.100.11.8 prefer210.72.145.44203.117.180.36131.107.1.10time.asia.apple.com64.236.96.53130.149.17. ...

  4. Windows下记事本编辑的Shell脚本放到Linux下执行出错,格式问题(/bin/bash^M: bad interpreter: 没有那个文件或目录)

    错误: /bin/bash^M: bad interpreter: 没有那个文件或目录 解决方案: 运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就 ...

  5. bmp to jpg

    uses Jpeg; function BMPtoJPG(var BMPpic, JPGpic: string): boolean;var  Bitmap: TBitmap;  JpegImg: TJ ...

  6. iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备

    XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...

  7. android学习日记08--Paint画笔

    Paint 要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布Canvas上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设 ...

  8. perl指针引用

    http://bbs.chinaunix.net/forum-viewthread-tid-570031.html

  9. 正则匹配ab不匹配aab

    var a = "aababaabababababaab"; a.replace(/(^|[^a])(ab)+/g, "$1"); var a = " ...

  10. 文件I/O之ioctl函数

    ioctl函数是I/O操作的杂物箱.不能用其他函数表示的I/O操作通常都能用ioctl表示.终端I/O是ioctl的最大使用方面. ioctl函数通过对文件描述符发送特定的命令来控制文件描述符所代表的 ...