flash載入檔案有兩種常規方式:一種是urlloader,可以載入文字、二進位制資料或 url 編碼變數形式的資料,然後轉換成簡單的文字形式或值對字串形式;一種是loader,可以將載入的影象檔案轉換成bitmapdata,也可以解析swf檔案。(socket, localconnection這些非常用類不在討論範圍)
載入的資源應被統一管理以方便呼叫和重用,管理方式一般有兩種:一種是將資源全部打包進swf;一種是載入分散資源通過配置進行管理。我將對這兩種管理方式進行介紹。
在編輯fla檔案時,我們可以匯入各種,並為其設定鏈結名。除手工逐個操作外,我們可以借助jsfl進行自動化處理(請參考
)。通過new的方式就可以例項化獲得的bitmapdata或movieclip類,然後使用。因此專案中要想得到乙個資源,只要知道它的鏈結名即可。鏈結名是自行設定的有意義的名字,完全可以當做資源的唯一id。
需要注意的是,new的過程就是解壓縮的過程。處於class狀態時,占用的記憶體和swf檔案中這個占用的磁碟空間一致,而一旦通過new解壓成無壓縮的bitmapdata後,占用的記憶體會急劇增加。不管是png、jpg,還是向量動畫,new之後的體積都會比原來大得多,因此不要隨便將資源例項化後暫存。這個例項化過程理所當然是比較費時的,可能會出現卡的現象,但預先例項化,記憶體占用上是有很大區別的。
此外,如果選擇設定loadercontext使得全部資源載入到同乙個域的話,有衝突的鏈結名是以先來先到的原則處理,即如果兩個資源鏈結名相同,以先載入的物件為準。
打包成swf有乙個優點,swf可以讓jpeg支援透明通道。一般來說,jpeg壓縮率高而不支援透明通道,png壓縮率低支援透明通道。將png匯入fla然後設定成jpeg壓縮後,就能在壓縮的同時保留透明通道,可以讓支援透明通道的體積大大減小。
打包成swf後,載入快且易於管理,是推薦方式。但這種做法限定你必須一次性載入所有資源,不能按需載入,有一定的侷限性。比較適合載入ui**,以及需要立即顯示的圖示等等。
還有一點需要注意:swf舞台上的內容,即使不顯示出來也會消耗資源,因此請務必保證在發布時舞台為空。
如果檔案要按需載入,或者不希望用swf打包增加維護成本,或者有大量文字以致於不能用fla匯入,那我們只能逐個檔案載入。
因為資源可能處於不同目錄,命名也不規範,也會有副檔名,這樣的路徑在**中作為id存在是不合適的。所以一般都會有乙個文字配置檔案,將這些檔案路徑和乙個名稱對應起來,並提供給模組載入。載入完成後則是通過這個名稱來獲取資源。
不同檔案有不同的載入方式,文字和二進位制檔案只能通過urlloader載入,而png、jpg、swf等檔案則可以通過loader和urlloader兩種方式載入。如果資源需要長期儲存,建議全部用urlloader方式載入,在需要獲取資源時,再通過loader的loadbytes方法解析已經載入的二進位制資料,之後再顯示。
這樣做目的是為了節省記憶體,因為loader載入的資源會自動例項化(解碼),png、jpg會展開成無壓縮的bitmapdata,swf舞台的內容也會全部例項化,他們會占用大量記憶體。先用urlloader將他們作為二進位制資料載入,需要時再解碼例項化,就不會出現這個問題。
為了解決這個問題,我們需要一種特殊的佇列載入模組,可以同時載入,但是同時載入的檔案數量不能超過某個值。基本思路就是在載入完乙個檔案後,檢查正在進行載入的檔案數量,小於定值就取佇列中的下乙個位址新建載入,否則就什麼都不做。
bulkloader(
),loadermax(
)都提供了這個功能,當然我的ghostcat
也通過assetmanager(復合queueloadoper實現)提供了這個功能。複雜度實際上並沒有比線性載入高多少。
當載入檔案數量特別大的時候(諸如數百個),注意不要只使用陣列儲存。你可以建立乙個dictionary,然後將名稱作為鍵載入內容作為值,做乙個雜湊表,以後都直接通過名稱從這個雜湊表取值,會比遍歷陣列查詢名稱快很多。
使用zip或其他打包形式
。zip的優點是可以用winrar開啟,不需要借助專門的工具,缺點則是解壓需要時間。當然,你也可以考慮用二進位制自定義乙個封裝格式,這樣也能加密資源檔案,但這需要你自己編寫乙個管理工具。當然,這也不算特別麻煩。
現在不少遊戲都採用了這種做法,效果還是可以的。
我們可能在開始時會載入多個檔案。比起每載入乙個檔案顯示一次進度條從0%到100%的過程,顯然是顯示所有檔案總體的載入進度,只進行一次從0%到100%的過程更具有實際意義。但是flash做這件事情並不太容易,因為它想要獲得乙個檔案的大小就必須去載入它,而這個載入需要時間,你沒有辦法從一開始就立即獲得所有檔案的大小。
實現的方法只有乙個,就是在程式中或者配置中寫死所有檔案的總大小,然後根據所有檔案已經載入位元組數的總和來計算和顯示進度。
至於這個總和如何獲得,可以在程式中寫上trace,實際載入執行一次便能獲得實際所有檔案大小總和,也可以做專門工具計算,也可以用作業系統來直接檢視總和,總之方法不是問題。而且,即使這個值不準確也無大礙,因為載入流程依然是按載入完所有檔案作為依據,而這個進度只是用來顯示,就算不准也不過是未到100%就結束或者到了100%也要等待一段時間才能結束。這無傷大雅。
之前所說的類庫都提供了這樣的功能。
swf必須載入完所有類後才能開始執行並顯示影象,這樣一來,第乙個主swf載入自己時就無法顯示載入進度。解決這個問題有兩種辦法:
一種辦法很老但是實用,就是建立乙個小swf先顯示出來,專門用來載入主swf,主swf載入完畢後它就完成了使命。實際上這並不麻煩也是最穩定的一種方案。
另一種方式是利用frame元標籤。在主swf類名上面新增
[frame(factoryclass="載入類類名")]即可指定乙個類作為載入類,它會在主swf未載入完之前顯示。這個類是乙個兩幀movieclip,當它自己載入完畢後,就可以反射出主swf的內容並例項化。
可以看這篇文章:
。而我自己的載入類模板則是這個,可以作為參考:
Flash務實主義(六) Loading
flash載入檔案有兩種常規方式 一種是urlloader,可以載入文字 二進位制資料或 url 編碼變數形式的資料,然後轉換成簡單的文字形式或值對字串形式 一種是loader,可以將載入的影象檔案轉換成bitmapdata,也可以解析 swf檔案。socket,localconnection這些非...
Flash務實主義(三) 最短路徑原則(下)
首先是個轉場特效問題。其實我早想到做法了,只是當時還沒實踐。增加混合 blendmode.add 只要關係到光效,泛用性就很高,疊加著畫上去看起來應該就是這個效果。但是我還是先到群裡問了下,然後一幫人就跟我說徑向模糊。還有一幫人說以前搞過,拿我的原圖上了個徑向模糊發給我。但是徑向模糊多慢用過ps都知...
做務實的理想主義者 位元組跳動宣講會有感
有幸參加了位元組跳動的宣講會,也算提前了解一下 好做個準備,順便膜拜一下大牛。但正如hr所說,行業決定下限,企業決定上限。未來像位元組跳動這樣的獨角獸不知道還會走多遠,以後也不一定能加入到位元組跳動,但是就像張一鳴所說,年輕人應該和優秀的人做有挑戰的事,做務實的理想主義者。這正符合我的想法,從小到大...