谈谈多段加载

很多webgame 里面的预加载 阶段都是能显示所有资源的总大小百分比和当前加载的资源的大小百分比,但是as中的 ProgressEvent 事件 却只提供有当前加载对象的已加载 bytes 和总的 bytes,不提供全部的加载进度信息,那么webgame的预加载是怎么做到的呢?看了常用的一个资源加载类 BulkLoader ,秘密就在其中。
  BulkLoader是一个提供统一的资源加载函数、实现多种类型的资源文件 加载的开源类。功能强大。先下载一个BulkLoader。然后打开查看它的源码 ,看到第967行的_onProgress方法:


var e : BulkProgressEvent = getProgressForItems(_items);


其中第969行调用了 getProgressForItems 方法获取了一个 BulkProgressEvent事件,这个事件中包含了预加载过程中用到的所有数据 。下面看看 getProgressForItems 方法。

  getProgressForItems 方法中的for each 循环里包含了所有的预加载数据的计算过程:


var localWeightPercent : Number = 0;
var localWeightTotal : int = 0;
var itemsStarted : int = 0;
var localWeightLoaded : Number = 0;
var localItemsTotal : int = 0;
var localItemsLoaded : int = 0;
var localBytesLoaded : int = 0;
var localBytesTotal : int = 0;
var localBytesTotalCurrent : int = 0;
var item : LoadingItem;
var theseItems : Array = [];
for each (var key: * in keys){
item = get(key);
if (!item) continue;
localItemsTotal ++;
localWeightTotal += item.weight;
if (item.status == LoadingItem.STATUS_STARTED || item.status == LoadingItem.STATUS_FINISHED || item.status == LoadingItem.STATUS_STOPPED){
localBytesLoaded += item._bytesLoaded;
localBytesTotalCurrent += item._bytesTotal;
localWeightLoaded += (item._bytesLoaded / item._bytesTotal) * item.weight;
if(item.status == LoadingItem.STATUS_FINISHED) {
localItemsLoaded ++;
}
itemsStarted ++;
}
}

// only set bytes total if all items have begun loading
if (itemsStarted != localItemsTotal){
localBytesTotal = Number.POSITIVE_INFINITY;
}else{
localBytesTotal = localBytesTotalCurrent;
}
localWeightPercent = localWeightLoaded / localWeightTotal;


里面就包含了计算全部加载的总百分比的操作。它的原理用到了权重的概念,类似于学分的计算方法:(Σ(学科的学分×学科成绩百分比))/总学分 (大致如此吧……)
  然后全部的加载资源的百分比则是:Σ((item[I]._bytesLoaded / item[I]._bytesTotal) × item[I].weight))/localWeightTotal

  现在原理搞清楚了,剩下的就是把加载队列的机制做好就行了:)

你可能感兴趣的:(Web)