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. js防刷新的倒计时

    近期在维护考试系统,在进行考试測试时无意中点击了刷新button.可是上面的倒计时并没有受到影响.同一时候在几篇博客中也有这种样例,所以我想看看它究竟是如何防止刷新的. 假设是用cs代码写.我们可能会 ...

  2. HDU 1718 Rank counting sort解法

    本题是利用counting sort的思想去解题. 注意本题,好像利用直接排序,然后查找rank是会直接被判WA的.奇怪的推断系统. 由于分数值的范围是0到100,很小,而student 号码又很大, ...

  3. C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮【转载】

    使用WebBrowser控件,在documentComplete事件处理器里写 HtmlElement name = webBrowser1.Document.GetElementById(" ...

  4. android学习日记02--Activity简介

    一.Activity活动 学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面. Activ ...

  5. linux上安装ftp

    1.安装 rpm -ivh vsftpd-2.2.2-11.el6_4.1.x86_64.rpm 2.启动 service vsftpd start 3.连接 windows 命令行输入 ftp ww ...

  6. oracle11g密码大小写敏感问题

    密码大小写敏感是Oracle 11g数据库默认的一个新特性,数据库配置助手(DBCA)在创建数据库期间允许你将这个设置返回到11g以前的功能. SEC_CASE_SENSITIVE_LOGON初始化参 ...

  7. 0x800a1391-Microsoft Jscript "JSON未定义"

    本人在进行调试代码是遇到以下问题: 在运行到var result = JSON.parse(data);这句时,报错:JSON未定义.如下图:

  8. C# 重新改变数组的长度

    重新改变数组的长度 System.Array.Resize(ref FieldName, j);

  9. Android_Menu_PopupMenu

    layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...

  10. mysql数据库常用语句2

    关于mysql常用语句的整理,上一篇涉及到ddl.dml以及一些简单的查询语句. 1:mysql分页查询 select * from table_name limit 5,10;   从下标为5元素查 ...