简单改造 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 ... 
随机推荐
- Java中3DES加密解密与其他语言(如C/C++)通信
			国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ... 
- PowerShell查询sql server
			function Invoke-SQL1: function Invoke-SQL { param( [string] $DBServer, [string] $Database, [string] ... 
- Http协议网络对时工具
			2009-09-17 11:52:31 专业的网络对时软件大多採用NTP协议来获取专业时间server时间对时,也有採用SNTP协议的,本来也想做个SNTP或NTP协议的对时工具自己用,尽管我手上也有 ... 
- HDU 5501 The Highest Mark 背包dp
			The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ... 
- Codeforces Round #324 (Div. 2) D. Dima and Lisa 哥德巴赫猜想
			D. Dima and Lisa Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/probl ... 
- 详解Android Handler的使用
			我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ... 
- jquery实现无缝滚动
			//点击上一页 $('.pointLeft').click(function() { if (prevAllow) { prevAllow = false; scrollUlLeft = scroll ... 
- window.top、window.parent
			iframe和frameset中可能会用到window.parent.window.top 其中window.parent是相对于打开子页面的当前js所在页面的层级: 例如:a页面中包含一个ifram ... 
- DBCP数据源
			DBCP数据源是Apache软件基金组织下的开源连接池实现,需要两个jar文件:Commons-dbcp.jar 连接池的实现和Commons-pool.jar 连接池实现的依赖库 
- MySql添加用户,新建数据库,用户授权,删除用户,修改密码
			转自:http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html MySql中添加用户,新建数据库,用户授权,删除用户,修改 ... 
