世界地圖(無接縫)

Flash Loading 的感慨



我是一個.NET的程序員,起先由於公司的需要,不得不學習Action Script。當時情況很糟,專案來了,迫在眉睫,但是公司捨不得出錢請個AS的程序員(AS的程序員要價總是太高),我只能一邊學習,一邊做專案,幸好Action Script 3.0的面向對象的,這讓我感覺也不太難懂,經過一段時間學習,慢慢對於Flash的理解要稍稍多了一些,不知不覺,公司又接了幾個Flash的專案,感覺都還能勝任。不過,直到昨天,我才明白Flash的loading的含義。

以下言論是我自身的理解,不保證100%正確,如有謬誤,還請指出,並見諒。

你是否曾經被要求把Flash做到加載幾KB就要顯示呢,如果有,並且你不知道如何解決的話,請繼續向下看;如果您是高手,並且也有興趣的話,也請繼續,並在適當的時候指出我的我的錯誤。

Flash要顯示內容,至少得等第一影格下載完畢,很簡單吧。

不過,你是否清楚你的第一影格有多大呢?如果你說你的第一影格很小,因為你留的是一個空白的影格,那不一定。現在我的這個專案的Flash裡,做了很多的linkage,您可能明白了,Action Script導入的那一影格不管是不是空白,都是可以很大,所以,在我們經典論壇的Flash版塊裡總是會看到版主說,做loading用三影格,第一影格loading,第二影格導出腳本,第三影格開始程序……    

但是為什麼要這樣做呢?

您還記得Flash至少要加載第一影格才能顯示的道理吧,所以,要盡快的顯示Flash的loading,要盡量減小第一影格的大小,把loading的邏輯寫在第一影格,將Action Script導出在第二影格,這樣,導出的內容就影響不到你,最後,你會在第三影格,也就是加載完成後,開始主程序邏輯。

在Flash的publish settings(快捷鍵Ctrl+Shift+F12),選擇"Flash"選項卡,點擊"Script"的那個"settings",把"Export class in frame 1"改成"Export class in frame 2",這樣,你的程序的類會導出到第二影格,它不會把第一影格(loading所在的影格)變大,從而進快顯示loading。



看看效果吧,在publish settings中,把"Generate size report"勾選,看看發佈後flash文件的體積報告:

Frame #    Frame Bytes    Total Bytes    Scene

1          23892          23892    Main Scene
2         155519         179411     (AS 3.0 Classes Export Frame)
3             36         179447    

而把Action Script發佈到第一影格呢:

Frame #    Frame Bytes    Total Bytes    Scene

1         106125         106125    Main Scene (AS 3.0 Classes Export Frame)
2          70771         176896    
3             36         176932

你看,如果導出到第二影格,第一影格的體積大約是24KB,這是因為loading動畫效果有這樣大的體積;而如果將AS發佈到第一影格,則變成了106KB,主要的加載內容都在第一影格了,這說明這個loading就比較失敗 。

另外,你可能還會遇到這樣的問題:當你辛苦的為你的loading寫了一個類,叫myFlashAppPreLoader,在第一影格時,你是這樣寫的:
(帶有一點點語法高亮的版本,希望不要當AD,這個位置什麼也沒有的,AD它也沒用 )
程序代碼 程序代碼
//private variables
private var loader:myFlashAppPreLoader;
……
  
//constructor
loader=new myFlashAppPreLoader();
this.addChild(loader);
this.loaderInfo.addEventListener(Event.COMPLETE,loadCompetedHandler);
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS,LoadingHandler);
……
  
//some other function
private function loadCompetedHandler(e:Event) {
            this.removeChild(loader);
}

你這樣做的原因在於,你想把loading封裝成一個類,你直接用就好了,方便!

可是,這樣帶來一個極大的問題:

試想,你剛剛把AS導出在第二影格了,現在你的第一影格是loading,第一影格就用第二影格的東西……邏輯不太對吧?

所以,在第一影格的loading裡,不要把loading寫成類,請直接在舞台的第一影格裡放loading的動畫,對,把它們通通放到舞台上,這樣,你可以直接在document class中對其中進行操作,想要什麼動畫也可以自行控制了。
程序代碼 程序代碼
//constructor
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS,LoadingHandler);
……
  
//loading animation handler
private function LoadingHandler(e:ProgressEvent):void {
            txtProgress.text=String(Math.round(e.bytesLoaded/e.bytesTotal*100));
}

這裡的txtProgress就是舞台上一個DynamicTextField的實例名稱,我直接用它賦一個百分比的值,如果你loading的時候要控制更多的元件,也可以同樣這樣做。

末尾的時候,提醒大家多留意一個size report,這裡面不但可以看到影格的體積情況,還可以看到圖形、元件、嵌入字體等的大小,對分析你的Flash用處多多哦。

其它網友的看法:

引用內容 引用內容
dearmite:
剛剛巧 我也是一個程序員,而不是flasher 。
我對這個倒有不同的理解。
為什麼flash 會出現loading...??
那就是因為他們這些flash是flasher做出來的,而並非是程序員做出來的。

很多的網站,都是以flash為主,使用flash 調用另一個flash 不管另一個flash 裡面的資源是不是第一個flash需要的。

但是AS3.0的競爭目標是誰呢???
是Ajax !
為什麼AJAX沒有出現flash的loading 的現象?(雖然AJAX也有很多的loading 的效果,但是為什麼大家沒有人討論呢???)
因為AJAX 是程序員在做。
AJAX每次只加載這個頁面上必須的無素,而並非幾個點擊後的所有的元素。

而太多數的FLASH的網站,做的太過於花哨了。
已經完全失去了和AJAX爭異步  的那個主要方向。

ADOBE應該也發現了這個現象,所以AS3,一下子把AS1,AS2,給甩開。
直接溶入JAVA的東西。

這樣,AS3 ,flex buider肯定會吸引一批JAVA程序員會參加AS的開發。
而不是flasher 。
JAVA程序員當然比flasher更關心網頁的展開速度。

還有一個重要的原因JAVA程序員肯定比flasher 的flash水平要差很多。
不會添加過多的技巧。
這樣flash自然也會體積變小了很多。
loading...這個東西在flash論壇裡,討論的很多。

但實際上,根本沒有作用。
試想一下,你的手機現在每天都在接收著flash 這種形式的新聞。
如果每天都是loading...
信息還是慢慢的出來。

你恨不得不要這種loading...吧。
相反,flash 也影響了觀眾,
因為大多數的flash都要loading 所以大家對於flash 的這種loading 也就原諒了。
這也是flash全站,為什麼到現在為止只停留在欣賞上。

因為,他們的確太不實用了。。。
把研究loading 的精力來研究一下如何讓flash變得更流暢吧!


引用內容 引用內容
根本不用做loading,就讓它一開始空白一片就行了,加載完自然就顯示了!


引用內容 引用內容
LOADING這東西,我覺得是在象廣告時間發展。給人加強LOGO印象用的。


引用內容 引用內容
多謝樓主(論壇),在你空間發言未遂!
這個問題一直困擾著我!其實也不僅我,老外都有專門網站研究做自身加載研究的,你終於把方法找到了,太感謝了。
樓上有幾位(回覆者)似乎不會as,看樣子不知道樓主說的是啥,更不知道樓主(論壇)說的價值所在。


引用內容 引用內容
作者回覆:
首先,感謝8樓的同學給予我肯定的評價,謝謝。

對於2#的同學與ajax比較,我也認為說得很有理,不過,毫無疑問,flash的loading在大多數情況下都是必要的;正如您說的那樣,flash變得很大通常都是flasher幹的,他們導出的圖片、元件,或者是一些逐幀動畫,都好大,我們隨時都可以看到一個個2m 以上的flash ,不用猜我們就知道這裡面含有大量的圖片、聲音、動畫或是字體…因為,我們很難想像一個純as的flash 會超過2 m ,那樣的程式設計師太令人敬畏了。

不過,雖然flasher使得flash遠遠變大了,但是他們的工作卻是重要且不可替代的,作為程序員,應該感謝他們,設想你的客戶要求你用as畫出所有的水晶圖標,或是要求你用as做出一個人物並展現他的跑步和摔倒的過程,在這個過程中必須呈現出所有的複雜細節…我想,所有的程序員都會認為,「天!不可理喻」。就算你忍氣吞聲,天天加班,完成了這件事,可是你發現,由於呈現過多的動畫細節,你的flash太耗cpu了,甚至拖得ie或firefox死掉,而當然,客戶在死機的過程中沒有看到你的任何動畫,從而否定了你的工作,你想解釋,可是你能要求客戶升級他的機器然後在看這個動畫嗎?

還有,我也不認為flash需要刻意地與ajax比較,因為flash的意義已經遠遠超出了局部刷新的範疇,他還有更多更多的特性,我想,他的競爭對手應該是有強大支持的silverlight,silverlight的出現,會吸引大量的·NET程序員,並且,silverlight作為·NET的一員,能很好的與asp·net融合在一起、方便的通信,並且·NET的程序員不需要花很大的力氣就能開始silverlight之旅。


程序代碼 程序代碼
dearmite:
沒有絕對的全矢量化,也沒有絕對的全BITMAP是不???
如果大多數的人,用flash 的都注意一下裡面的圖片,
那flash的情況會好很多。

另外,上面說不用AS的人說什麼loading的重要。
這個是對的。因為現在的flash 3.0才出來,FLEX這種思路才剛剛發展嘛。
如果AS 不向著面向對像發展,
那flash 再過幾年,還是某些人手中的玩物。。


引用內容 引用內容
也就是說,要把由程序控制的大型FLASH立刻顯示的方法,只有做成三楨?並且不要去做成類?


引用內容 引用內容
我認為,大型的flash 要想馬上顯示,
應該把flash 做個很多很多的小flash。


引用內容 引用內容
樓上,你說的狀況我現在正在做,把各部分都拆成小FLASH。

但是實際上是LOADING對調用其它FLASH這個過程根本不起作用。
LOADING管它自已第一楨100%跳轉ACTION了.然而LOAD其它FLASH的內容還都沒出來。
這也可能是我的代碼問題?我正在解決試驗中...

但接下來還有一個問題:第一楨還是第三楨導入更好?
如果選擇第三楨調入的話,LOADING完全失去意義,最好改成每個部分都有分LOADING。
第一楨調入的話,又怕時間太長,大家等的煩!

這些問題其實很多好的實例中都有解決,呵呵,只是我要些時間研究一下。如果高手能直接指點,當然感激不盡!


引用內容 引用內容
樓主(論壇)說的很有道理。

另外應用程序中外帶LOADING可以提高重用和減肥。

可是對於有些特殊的設計類FLASH,LOADING和內容之間有流暢的轉場,這樣的情況需要在同一個SWF中放置內容和LOADING。


引用內容 引用內容
gmail有loading,我這裡打開gmail加載時間還不短呢
某些特殊的flash網站當然沒法跟ajax的比了,像那種房地產之類的網站唰一下就打開了,客戶還不樂意呢,某些flash網站就應該有loading



[本日誌由 Admin 於 2009-02-12 03:12 AM 編輯]
文章來自: 藍色論壇
引用通告: 查看所有引用 | 我要引用此文章
Tags: loading
評論: 1 | 引用: 0 | 查看次數: 2931
  • 1
阿破 [2009-02-13 01:07 PM]
建議用一個空白主影片去讀取外部swf,而此swf本身包含想使用的類別物件。
當然類別的所在會造成開發上的麻煩,但在控製上會靈活很多。
小弟淺見的是, flash本身在當初就是定位為多媒體的互動及動畫的播放。
在以前的網路環境500k的讀取就很久了,而對當時的網路環境來說flash很容易成為讀取速度的大怪物
當然也就充斥著loading的製作。
而就現階段來說,運用loading讓使用者知道自己正在導引到那個區塊的情況還是需要的,
但這需視檔案的狀況而論,基本上,小弟將loading認定為一種引導的方式。

目前的flash已跳脫了只是單純的動畫或單純的點選功能,它擁有開發一個RIA的能力,
甚至AIR的出現也改變了他整合的無限可能。跟sliveligh ajax來說,flex是更類似的產品。
三者份皆有優缺點,但就目前資源來說,flash家族有完整的產品線所支撐。
ajax是非常棒的技術,但就跟平台來說,它的開發成本比flash貴上許多。
  • 1
發表評論
昵 稱:
密 碼: 游客發言不需要密碼.
內 容:
驗證碼: 驗證碼
選 項:
雖然發表評論不用注冊,但是為了保護您的發言權,建議您注冊帳號.
字數限制 1000 字 | UBB代碼 開啟 | [img]標簽 關閉