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. Java中3DES加密解密与其他语言(如C/C++)通信

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. PowerShell查询sql server

    function Invoke-SQL1: function Invoke-SQL { param( [string] $DBServer, [string] $Database, [string] ...

  3. Http协议网络对时工具

    2009-09-17 11:52:31 专业的网络对时软件大多採用NTP协议来获取专业时间server时间对时,也有採用SNTP协议的,本来也想做个SNTP或NTP协议的对时工具自己用,尽管我手上也有 ...

  4. 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 ...

  5. 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 ...

  6. 详解Android Handler的使用

    我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主 ...

  7. jquery实现无缝滚动

    //点击上一页 $('.pointLeft').click(function() { if (prevAllow) { prevAllow = false; scrollUlLeft = scroll ...

  8. window.top、window.parent

    iframe和frameset中可能会用到window.parent.window.top 其中window.parent是相对于打开子页面的当前js所在页面的层级: 例如:a页面中包含一个ifram ...

  9. DBCP数据源

    DBCP数据源是Apache软件基金组织下的开源连接池实现,需要两个jar文件:Commons-dbcp.jar 连接池的实现和Commons-pool.jar 连接池实现的依赖库

  10. MySql添加用户,新建数据库,用户授权,删除用户,修改密码

    转自:http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html MySql中添加用户,新建数据库,用户授权,删除用户,修改 ...