Skip to main content

Load Manager for FL2.X (1)

載入控制常常是各大Flash討論版中名列前矛的老掉牙問題串,可見如何做好載入控制是一個很重要的課題,FL1.1 載入外部檔案的限制是一個frame只能執行一次載入,而 FL2.X 則是一個frame只處理5次載入事件,FL1.1 載入研究在很久以前就已經分享過了,所以這次與大家分享是幾種FL2.X處理載入控制的方法:

Load Manager有個很重要的特點:唯一性,當多個載入的SWF中如果也有load行為時,Load Manager只能存在一個。

為了達到Load Manager的唯一性,這邊使用程式 Design Pattern 中蠻常用的 Singleton Pattern來實作,講到這邊大概已經有人快崩潰了,連Design Pattern的字眼都出現了,感覺越扯越專業捏?不過別緊張,搞不懂原理的人就直接將.as拿去修改使用就好,Erin一直認為,如果你對它有興趣,就會願意花很多時間去理解它,強求是沒有用的。回到正題,Singleton 顧名思義就是"獨生子",它的原理就是讓 Class只有一個實體,不管誰來跟它要東西,它也只提供一個窗口。好嚕!Erin 的懶人程式講解就到這邊,有興趣的請直接點選上面的聯結去理解它個夠!

[LoadManager.as version 1 教學檔下載]

LoadManager.as:
在一開始的屬性宣告就建立一個實體
private static var _manager:LoadManager = new LoadManager();
提供窗口讓外部取得實體,這樣的方式就可以確保所有人使用LoadManager時,用到的都是同一個實體。處理載入事件的是最簡單的 onEnterFrame,目的是讓loading工作簡單化,手機AP開發重點之一:簡單卡好
static function getInstance():LoadManager {
return _manager;
}

用法:
var loader = LoadManager.getInstance();
loader.loadClip(fileURL, targetMovieClip);


接下來測試看看
LoadManager01_1.swf:
var loader = LoadManager.getInstance();
for (var i = 0; i<7; i++) {
var mc = this.createEmptyMovieClip("m"+i, i+1);
loader.loadClip("2.swf", mc);
mc._x += i*20;
}


LoadManager01.swf:
var loader = LoadManager.getInstance();
var haha = this.createEmptyMovieClip("mc", 0);
haha._y = 100;
loader.loadClip("LoadManager01_1.swf", haha);
//載入LoadManager01_1.swf來共用LoadManager
for (var i = 0; i<7; i++) {
var mc = this.createEmptyMovieClip("m"+i, i+1);
loader.loadClip("1.swf", mc);
mc._x += i*20;
}



output message:
*** Load manager: start ***
Load manager: load LoadManager01_1.swf to _level0.mc
Load manager: load 1.swf to _level0.m0
Load manager: load 1.swf to _level0.m1
Load manager: load 1.swf to _level0.m2
Load manager: load 1.swf to _level0.m3
Load manager: load 1.swf to _level0.m4
Load manager: load 1.swf to _level0.m5
Load manager: load 1.swf to _level0.m6
Load manager: load 2.swf to _level0.mc.m0
Load manager: load 2.swf to _level0.mc.m1
Load manager: load 2.swf to _level0.mc.m2
Load manager: load 2.swf to _level0.mc.m3
Load manager: load 2.swf to _level0.mc.m4
Load manager: load 2.swf to _level0.mc.m5
Load manager: load 2.swf to _level0.mc.m6
*** Load manager: closed ***

你會發現它共分了三個frames將所有的東西載入!^^

on target 實際測試:(Nokia 7610)
很不幸的,當大量的載入在同一時間執行,即使已經使用單一窗口進行載入工作,還是會有漏圖的情況產生,尤其外部檔案大口吃掉記憶體時情況更為嚴重,所以在Flash lite AP的設計上,最好規避同一時間進行太多的載入工作,或者請愛用一個frame只做一次載入,這樣漏圖的情況會降到最低...修改很簡單,僅將 LoadManager.as中的doLoad迴圈部份mark起來就好...=)
private function doLoad() {
//while (_count++<5) {
if (_loadList.length>0) {
var now:Array = _loadList[0];
now[1].loadMovie(now[0]);
trace("Load manager: load "+now[0]+" to "+now[1]);
_loadList.shift();
} else {
trace("*** Load manager: closed ***");
_isLoading = false;
delete _eventHandler.onEnterFrame;
_eventHandler.removeMovieClip();
//break;
}
//}
//_count = 0;
}


也許還有其他更棒的方法,如果新發現的話再與大家分享...=)

Comments

Popular posts from this blog

PureMVC 我也會 [6]

Mediator ViewComponents 與 pureMVC 架構的中介 監聽並反應 View Component 發出的 Event 可以發送與接收 Notification 儘量少操作 Proxy 公開方法,多用 sendNotification... Mediator design pattern 要多認識這個 Mediator 設計模式的話,請自行看連結說明啊! 簡單來講,假使有一個 View 裡面有好幾個 MovieClip 組成,而這些 MovieClip 會互相影響對方...這個情況在 Flash 中,通常都會變成下圖: MovieClip 直接控制其他 MovieClip 搞到整個關係很複雜...換一個元件簡直是災難。 加入 Mediator 後,示意圖就會變成: 這樣,所有的 MovieClip 都透過 Mediator 來跟其他 MovieClip 溝通,當某一個 MovieClip 替換成別的元件,這時候也只需要修改 Mediator 中的引用即可,是不是變得很乾淨?如果同一組 MovieClip 有另外一個操作模式,也只需要替換掉 Mediator 即可!天下太平啊~~~ 而 PureMVC 中就是利用 Mediator class 為與前端 ViewComponent 的中介,這樣可以切開 ViewComponent 與 PureMVC framework 的關係,不管你前端介面使用 Flash or Flex 製作都跟程式核心無關。 所以 ViewComponent 製作時只需要兩個原則,一把所有的請求都以 Event 送出由 Mediator 處理,二提供公開方法, Mediator 只需要監聽 View 的 Event,將收到的資訊透過公開方法喂進 ViewComponent 即可。 如在 ViewComponent 中: public function setList( result:Object ):void{ list.dataProvider = result as ArrayCollection; } //然後在按下取得資料的按鈕 Click action 寫上: dispatchEvent( new Event( "GET_LIST" )); 新建 Mediator 的時候一樣有幾個重點方...