简单改造 starling 中的 AssetManager 让其更适合 批次加载纹理
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 让其更适合 批次加载纹理的更多相关文章
- Cesium中Clock控件及时间序列瓦片动态加载
前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrellis相结合.Cesium的强大之处也在于其 ...
- 一个简单的适用于Vue的下拉刷新,触底加载组件
一个简单的适用于Vue的上拉刷新,触底加载组件,没有发布npm需要时直接粘贴定制修改即可 <template> <div class="list-warp-template ...
- Tomcat中的类是怎么被一步步加载的?
了解Tomcat的类加载机制,原来一切是这么的简单. 一.类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载不同的类.当用 ...
- jQuery中的ready方法及实现按需加载css,js
模拟jQuery中的ready方法及实现按需加载css,js 一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的 ...
- Prism框架中加载类库中时其中第三方类dll提示无法加载程序集
Prism框架是采用一种依赖注入的方式动态加载程序集,能够在程序需要加载的时候将程序集注入到里面去,实现程序的热插拔效果,而且采用这种框架能够让我们进行一个大项目的独立开发,在最近的一个项目中在独立开 ...
- 模拟jQuery中的ready方法及实现按需加载css,js实例代码
这篇文章介绍了模拟jQuery中的ready方法及实现按需加载css,js实例代码,有需要的朋友可以参考一下 一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候 ...
- cocos2d-x lua中实现异步加载纹理
原文地址: http://www.cnblogs.com/linchaolong/p/4033118.html 前言 问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的 ...
- Vue中结合Flask与Node.JS的异步加载功能实现文章的分页效果
你好!欢迎阅读我的博文,你可以跳转到我的个人博客网站,会有更好的排版效果和功能. 此外,本篇博文为本人Pushy原创,如需转载请注明出处:http://blog.pushy.site/posts/15 ...
- nginx中有关命令和日志切割,配置文件加载的详细阐述
一.Nginx简介 Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器.Nginx 已经在俄罗斯最大的门户网站── Ram ...
随机推荐
- cocos2d-x 判断点击命中坐标的几种方法
转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019893.html //重载 virtual bool ccTouchBegan(CC ...
- go操作数据库 Go-SQL-Driver/MySQL 使用详解
go操作mysql的驱动包很多,这里讲解当下比较流行的Go-SQL-Driver/MySQL1.下载安装 执行下面两个命令: 下载:go get github.com/Go-SQL-Driver/My ...
- iOS开发——总结篇&IOS开发基础知识
IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...
- 小谈一下Java I/O
java中的I/O操作宏观上来说就氛围两个种类,一个是字节流 ,一个是字符流,分别相应着一组类和接口 字节流: InputStream 输入流的基类 OutputStream 输出流的基类 对于字节流 ...
- (转)Dependency Walker使用说明
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...
- 学习笔记之Shell & QSHELL
shell(计算机壳层)_百度百科 http://baike.baidu.com/subview/849/15831672.htm Shell (computing) - Wikipedia, the ...
- 用java开发的网站或者程序
中国移动的官网即其相关业务系统 阿里巴巴.淘宝网 58同城是java做的后台 铁道部12306 腾讯的拍拍网等 各大银行的交互应用系统,比如有的信用卡网银 另外,Android手机的大部分应用,其他智 ...
- linux vi 撤销重做于前进后退--转
在vi中按u可以撤销一次操作 u 撤销上一步的操作Ctrl+r 恢复上一步被撤销的操作 注意:如果你输入“u”两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容模式了.重做如果你撤销得太多 ...
- 深入理解计算机系统第二版习题解答CSAPP 2.16
填写下表,说明不同移位运算对单字节数的影响. x x<<3 x>>2(逻辑) x>>2(算术) 十六进制 二进制 二进制 十六进制 二进制 十六进制 二进制 十六进 ...
- centos安装crontab:
# yum install vixie-cron # yum install crontabs /sbin/service crond start //启动服务/sbin/service crond ...