谈谈多段加载

      很多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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值