使用手冊 取消

最佳作法 - 建立行動裝置內容的秘訣

 

建立用於行動裝置的 Animate 內容

若要建立行動裝置的 Animate 內容,請遵守一些基本原則。例如,Animate 開發人員常會避免極為複雜的圖稿和過度使用補間動畫或是透明度等。

由於 Flash Lite 在各個行動裝置上的效能都大不相同,因此開發人員必須面對額外的挑戰。如果內容必須發佈到許多不同的裝置,開發人員有時候必須針對最基本的共通處進行創作。

行動內容的最佳化需要取得優缺點的平衡。例如,某個技巧可能會使內容的顯示效果更好,而另一個技巧則可以提升效能。在評估這些優缺點的平衡關係時,需要在模擬器測試和目標裝置測試之間重複來回進行。您必須在實際裝置上查看內容,才能評估色彩的真實性、文字的可讀性、實際的互動情況、使用者介面的反應以及真實行動經驗的其他層面。

關於 Flash Lite 的內容不適用於 Flash CC 及更新版本。

行動裝置動畫的 Flash Lite 準則

在建立行動裝置的動畫內容時,請記住裝置的 CPU 限制。遵守這些準則有助於防止 Flash Lite 內容的執行速度緩慢:

  • 在建立新的 Flash Lite 檔案時,請檢查文件是否正確設定。雖然 Animate 檔案可以平滑地縮放,但是如果檔案不是以其原生舞台大小執行而必須在播放器中縮放,則效能可能會受到影響。請嘗試將文件的舞台大小設定為符合目標裝置的解析度。同時將 Flash Player 設定為正確的 Flash Lite 版本。

  • Flash Lite 可以用低、中等和高品質來演算向量圖形。演算品質越高,Flash Lite 就越能平滑和準確地演算向量圖形,對裝置 CPU 的需求也越高。若要提供複雜的動畫,請嘗試變更播放器的品質設定,然後徹底地測試 SWF 檔案。若要控制 SWF 檔案的演算品質,請使用 _quality 屬性或 SetQuality 指令。_quality 屬性的有效值為 LOWMEDIUMHIGH

  • 限制同時補間動畫的數目。減少補間動畫的數目,或排列動畫的順序,使一個動畫結束後才開始另一個。

  • 謹慎使用符號的透明度 (Alpha) 效果,因為它們會大大耗用 CPU 的效能。尤其請避免對具有 Alpha 色階而非完全不透明 (低於 100%) 的符號使用補間動畫。

  • 避免耗用過多 CPU 的視覺效果,例如大型遮色片、過多的動態、Alpha 混合作業、大量的漸層和複雜的向量等。

  • 嘗試補間動畫、關鍵影格動畫和 ActionScript 驅動的動作等組合,以產生最有效的結果。

  • 演算向量橢圓和圓形所耗用的記憶體,要比演算四邊形更多。使用圓形和橢圓的線條,也會大量耗用 CPU 的效能。

  • 經常在實際目標裝置上測試動畫。

  • Animate 在繪製動畫區域時,會在區域周圍定義矩形的邊界方框。請盡可能縮小該矩形以最佳化繪圖。另外請避免重疊的補間動畫,因為 Animate 會將合併的區域解譯為單一矩形,而使整體區域較大。請使用 Animate 的「顯示重繪區域」功能來最佳化動畫。

  • 避免使用 _alpha = 0_visible = false 隱藏螢幕上的影片片段。如果只是關閉影片片段的可見度或將其 Alpha 變更為零,則該影片片段仍會包含在線條演算計算中,因而可能對效能造成影響。

  • 同樣地,請勿藉由將影片片段遮在另一個圖稿後方來隱藏影片片段,因為該影片片段仍會納入播放器的計算中。應該將影片片段整個移到舞台之外,或藉由呼叫 removeMovieClip 移除影片片段。

行動裝置中的 Flash Lite 點陣和向量圖形

Flash Lite 可以演算向量和點陣圖形。每一種圖形都有其優缺點。是否要使用向量而非點陣圖形,並非總是那麼容易決定,而且經常取決於幾個要素。

向量圖形是在 SWF 檔案中以數學方程式精簡地表示,並在執行階段由 Flash Lite 播放器進行演算。相反地,點陣圖形是以圖片元素 (像素) 的陣列來表示,這種方式需要較多的資料位元組。因此,在檔案中使用向量圖形有助於降低檔案的大小和記憶體的使用量。

在縮放大小時,向量圖形也可以維持其平滑形狀,點陣圖影像則會變得稜角分明,或者可以清楚看到每個像素。

與點陣圖相較,向量圖形在演算時需要進行較高的處理能力,特別是有許多複雜形狀和填色的向量圖形。所以,大量使用向量圖形有時可能會降低檔案整體的效能。由於點陣圖形在演算時,所需的處理時間會比向量圖形來得少,所以對於某些檔案 (例如,要在行動電話上進行動畫顯示並捲動的複雜道路地圖) 而言是較佳的選擇。

請記住以下的注意事項:

  • 避免在向量形狀上使用外框。外框具有內外邊緣 (填色只有一個邊緣),在演算時需要雙倍的作業。

  • 轉角比曲線容易演算。在可能的情況下,請使用平坦的邊緣,特別是在非常小的向量形狀中。

  • 最佳化對於圖示之類的小型向量形狀特別有用。複雜的圖示可能會在演算時喪失細節,演算細節時所進行的作業形同浪費。

  • 一般而言,請將點陣圖應用於小而複雜的影像 (例如圖示),而將向量圖形應用於較大且較為簡單的影像。

  • 以正確大小匯入點陣圖形;不要匯入大圖形,然後在 Animate 中縮小,因為這會浪費檔案空間和執行階段的記憶體。

  • Flash Lite 播放器並不支援點陣圖的平滑化。如果縮放或旋轉點陣圖,可能會造成圖形外觀粗糙。如果有必要縮放或旋轉圖形,請考慮改用向量圖形。

  • 文字基本上只是非常複雜的向量形狀。當然,文字常常非常重要,所以很少能夠完全避免使用文字。需要文字時,請避免將其製作成動畫,或將文字置於動畫上。請考慮以點陣圖形式使用文字。如果是多行的動態和輸入文字,則文字字串的分行符號不會存入快取。Animate 會在執行階段進行分行,並在每次需要重繪文字欄位時,重新計算分行。靜態的文字欄位則不會造成問題,因為會在編譯階段就預先計算好分行。如果是動態內容,則動態文字欄位的使用是不可避免的,但如果有可能,請考慮改用靜態的文字欄位。

  • 盡可能減少 PNG 檔案中的透明度使用;即使對於點陣圖的透明部分,Animate 都必須計算重繪。例如,對於代表前景元素的透明 PNG 檔案,不要以全螢幕大小轉存透明 PNG,而應將它以前景元素的實際大小加以轉存。

  • 嘗試分別將點陣圖圖層和向量圖圖層組合成群組。Animate 需要針對點陣圖和向量圖內容執行不同的演算程式,而在演算程式之間切換很花時間。

針對行動裝置設定 Flash Lite 點陣圖的壓縮

在使用點陣圖時,可以設定影像壓縮選項以縮減 SWF 檔案大小 (依各個影像進行,或針對所有點陣圖影像統一進行)。

設定個別點陣圖檔案的壓縮選項

  1. 啟動 Animate 並建立文件。

  2. 在「元件庫」視窗中選取點陣圖。
  3. 在「元件庫」視窗中的點陣圖圖示上,按一下滑鼠右鍵 (Windows) 或按住 Control 鍵並按一下 (Macintosh),然後在內容選單中選取「屬性」,開啟「點陣圖屬性」對話框。
  4. 在「壓縮」彈出式選單中,選取下列其中一個選項:
    • 針對顏色或色調變化複雜的影像,例如相片或有漸層填色的影像,選取「相片 (JPEG)」選項。這個選項會產生 JPEG 檔案。選取「使用讀入的 JPEG 資料」核取方塊,使用為讀入的影像所指定的預設壓縮品質。若要指定新的壓縮品質設定,取消選取「使用匯入的 JPEG 資料」,然後在「品質」文字方塊中輸入一個介於 1 和 100 之間的值。較高的設定會產生較高品質的影像,但檔案也會較大,所以請依需求調整此值。

    • 選取「不失真 (PNG/GIF)」選項,以用於形狀簡單且色彩不多的影像。這個選項會使用不失真壓縮來進行影像的壓縮,這種方法不會放棄任何資料。

  5. 按一下「測試」,判斷檔案壓縮的結果。

    比較原始檔案大小和壓縮檔案大小,決定是否可以接受選取的壓縮設定。

設定所有點陣圖影像的壓縮

  1. 選取「檔案 > 發佈設定」,然後按一下「Flash」標籤顯示壓縮選項。
  2. 調整 JPEG 品質滑桿或輸入值。較高的 JPEG 品質值會產生較高的影像品質,但 SWF 檔案的大小也會較大。較低的影像品質會產生較小的 SWF 檔案。請自行嘗試不同的設定,以決定檔案大小和品質之間的最佳平衡。

針對行動裝置最佳化 Flash Lite 影格

  • 大多數支援 Flash Lite 的裝置會以每秒 15 到 20 個影格 (fps) 的速度播放內容。影格速率最低可能會到 6 fps。請於開發期間,請將文件的影格速率設定為大致與目標裝置的播放速度相等。這樣可以看出在效能有限的裝置上內容會如何執行。在發佈最終的 SWF 檔案之前,將文件的影格速率設定為至少 20 fps 或更高,這樣可避免在裝置能夠支援更高的影格速率時,效能受到限制。

  • 在使用 gotoAndPlay 時,請記住要先初始化目前的影格和要求的影格之間的每個影格,Animate 才能播放要求的影格。如果這其中許多影格都包含不同的內容,則使用不同的影片片段要比使用時間軸的效能更高。

  • 雖然將所有內容置於檔案開頭而預先載入內容,在桌上型電腦上是不錯的做法,但在行動裝置上進行預先載入卻可能延遲檔案的啟動。請將內容置於整個檔案中,以在使用影片片段時加以初始化。

針對行動裝置的 Flash Lite 內容最佳化 ActionScript

因為大多數行動裝置的處理速度和記憶體都受到限制,所以在開發用於行動裝置的 Flash Lite 內容 ActionScript 時,請遵守以下準則:

  • 檔案和其程式碼要盡可能保持簡單。移除未使用的影片片段、刪除不必要的影格和程式碼迴圈,並且避免過多的影格或外部影格。

  • 使用 FOR 迴圈所耗費的資源可能很多,因為在每個反覆運算中檢查條件會造成使用資源增加。如果反覆運算的成本和迴圈耗費的資源不相上下,請個別執行多次作業,而不要使用迴圈。程式碼可能比較長,但效能會有所改進。

  • 一旦不再需要影格架構的迴圈,就加以停止。

  • 在可能的情況下避免字串和陣列處理,因為這些作業可能很耗費 CPU。

  • 永遠試著直接存取屬性,而不要使用 ActionScript 的 getter 和 setter 方法,這兩種方法比其他的方法呼叫還需要耗費更多資源。

  • 以明智的方式管理事件。在呼叫偵聽程式之前,使用條件來檢查它是否存在 (非 null),能保持事件偵聽程式陣列的精簡。呼叫 clearInterval 清除任何作用中的間隔,然後在使用 unloadapplicationremoveapplicationClip 移除內容之前,呼叫 removeListener 移除任何作用中的偵聽程式。如果在取消載入影片片段時,有任何的 ActionScript 函數仍在參照 SWF 資料,則 Animate 不會回收 SWF 資料記憶體 (例如,從間隔和偵聽程式進行回收)。

  • 不再需要變數時,將其刪除或設定為 null,這樣會將變數標示為由記憶體回收。刪除變數有助於在執行階段時最佳化記憶體的使用,因為不需要的資源會從 SWF 檔案中移除。刪除變數的做法比起將它們設為 null 還要好。

  • 在記憶體回收之前,呼叫 removeListener 以明確地從物件移除偵聽程式。

  • 如果是以動態方式呼叫函數,且該函數會傳遞固定的參數集,請使用 call 而不要使用 apply

  • 將命名空間 (例如路徑) 設定得更為精簡以節省啟動時間。套件中的每個層級都會編譯為 IF 陳述式,並導致新的 Object 呼叫,所以路徑中的層級越少,越節省時間。例如,具有 com.xxx.yyy.aaa.bbb.ccc.funtionName 層級的路徑,會針對 com.xxx.yyy.aaa.bbb.ccc 實體化物件。某些 Flash 開發人員在編譯 SWF 程式碼之前,會使用前置處理器軟體將路徑縮短為唯一識別碼,例如 58923409876.functionName

  • 如果檔案是由多個使用相同 ActionScript 類別的 SWF 檔案所組成,在編譯時將這些類別從選取的 SWF 檔案中排除。這有助於縮短檔案下載時間及減少執行階段的記憶體需求。

  • 避免使用 Object.watchObject.unwatch,因為對物件屬性的每項變更都需要播放器判斷是否必須傳送變更通知。

  • 如果在時間軸關鍵影格上執行的 ActionScript 程式碼需要 1 秒以上才能完成,請考慮分割該程式碼,以在多個關鍵影格上執行。

  • 在發佈 SWF 檔案時,從程式碼移除 trace 陳述式。若要執行這項作業,在「發佈設定」對話框中的「Flash」標籤上,選取「忽略 trace 動作」核取方塊。

  • 繼承會增加方法呼叫的次數,並使用較多的記憶體:在執行階段時,包含所有必要功能的類別,會比從父類別繼承某些功能的類別來得有效率。因此在設計時,可能需要在類別的擴充性和程式碼的效率之間取得平衡。

  • 當一個 SWF 檔案載入另一個包含自訂 ActionScript 類別 (例如,foo.bar.CustomClass) 的 SWF 檔案,然後再取消載入該 SWF 檔案時,該類別定義會保留在記憶體中。為了節省記憶體,請明確刪除已取消載入 SWF 檔案中的任何自訂類別。使用 delete 陳述式,並指定完整類別名稱,例如:delete foo.bar.CustomClass。

  • 限制全域變數的使用,因為這種變數不會在定義它們的影片片段遭到移除後,標示為由記憶體回收。

  • 避免使用標準的使用者介面元件 (由 Flash 的「元件」面板提供)。這些元件是針對在桌上型電腦上執行而設計,並未針對行動裝置的執行而進行最佳化。

  • 在可能的情況下,避免將函數過度巢狀化。

  • 避免參照不存在的變數、物件或函數。與 Flash Player 的桌上型電腦版本相較,Flash Lite 2 尋找不存在變數的參照時速度很慢,而可能對效能造成重大的影響。

  • 避免使用匿名語法來定義函數。例如,myObj.eventName = function{ ...}。明確地定義函數比較有效率,例如 function myFunc { ...}; my Obj.eventName = myFunc;

  • 盡可能減少 Math 函數和浮點數的使用。計算這些值會降低效能。如果必須使用 Math 常式,請考慮預先計算值並將值儲存在變數陣列中。從資料表擷取值,比 Flash 在執行階段計算值快上許多。

管理行動裝置的 Flash Lite 檔案記憶體

Flash Lite 會定期從記憶體清除檔案不再參照的任何物件和變數。這稱為記憶體回收。Flash Lite 會每隔 60 秒或是在檔案記憶體使用量突然增加 20% 或以上時,執行記憶體回收程序。

雖然無法控制 Flash Lite 執行記憶體回收的方法和時機,您仍然可以刻意釋放不需要的記憶體。對於時間軸或全域變數,使用 delete 陳述式以釋放 ActionScript 物件所使用的記憶體。對於區域變數 (例如,在函數定義中定義的變數),無法使用 delete 陳述式來釋放物件的記憶體,但可以將參照物件的變數設定為 null。只要該物件沒有其他參照,這樣就能釋放物件所使用的記憶體。

下列兩個程式碼範例顯示如何刪除參照物件的變數,以釋放這些物件所使用的記憶體。這些兩個範例完全相同,除了第一個範例是建立時間軸變數,而第二個範例則是建立全域變數。

// First case: variable attached to a movie or
// movie clip timeline
//
// Create the Date object.
var mcDateObject = new Date();
// Returns the current date as a string.
trace(mcDateObject);
// Delete the object.
delete mcDateObject;
// Returns undefined.
trace(mcDateObject);
//
// Second case: global variable attached to a movie or
// movie clip timeline
//
// Create the Date object.
_global.gDateObject = new Date();
// Returns the current date as a string.
trace(_global.gDateObject);
// Delete the object.
delete _global.gDateObject;
// Returns undefined.
trace(_global.gDateObject);
// First case: variable attached to a movie or // movie clip timeline // // Create the Date object. var mcDateObject = new Date(); // Returns the current date as a string. trace(mcDateObject); // Delete the object. delete mcDateObject; // Returns undefined. trace(mcDateObject); // // Second case: global variable attached to a movie or // movie clip timeline // // Create the Date object. _global.gDateObject = new Date(); // Returns the current date as a string. trace(_global.gDateObject); // Delete the object. delete _global.gDateObject; // Returns undefined. trace(_global.gDateObject);
// First case: variable attached to a movie or 
// movie clip timeline 
// 
// Create the Date object. 
var mcDateObject = new Date(); 
// Returns the current date as a string. 
trace(mcDateObject); 
// Delete the object. 
delete mcDateObject; 
// Returns undefined. 
trace(mcDateObject); 
// 
// Second case: global variable attached to a movie or 
// movie clip timeline 
// 
// Create the Date object. 
_global.gDateObject = new Date(); 
// Returns the current date as a string. 
trace(_global.gDateObject); 
// Delete the object. 
delete _global.gDateObject; 
// Returns undefined. 
trace(_global.gDateObject);

如前所述,您無法使用 delete 陳述式來釋放區域函數變數所使用的記憶體,而要將變數參照設定為 null,這與使用 delete 的效果相同。

function func()
{
// Create the Date object.
var funcDateObject = new Date();
// Returns the current date as a string.
trace(funcDateObject);
// Delete has no effect.
delete funcDateObject;
// Still returns the current date.
trace(funcDateObject);
// Set the object reference to null.
funcDateObject = null;
// Returns null.
trace(funcDateObject);
}
// Call func() function.
func();
function func() { // Create the Date object. var funcDateObject = new Date(); // Returns the current date as a string. trace(funcDateObject); // Delete has no effect. delete funcDateObject; // Still returns the current date. trace(funcDateObject); // Set the object reference to null. funcDateObject = null; // Returns null. trace(funcDateObject); } // Call func() function. func();
function func() 
{ 
    // Create the Date object. 
    var funcDateObject = new Date(); 
    // Returns the current date as a string. 
    trace(funcDateObject); 
    // Delete has no effect. 
    delete funcDateObject; 
    // Still returns the current date. 
    trace(funcDateObject); 
    // Set the object reference to null. 
    funcDateObject = null; 
    // Returns null. 
    trace(funcDateObject); 
} 
// Call func() function. 
func();

在 Flash Lite 中載入行動裝置的資料

在開發行動裝置的檔案時,盡可能減少一次載入的資料量。如果要在 Flash Lite 檔案中載入外部資料 (例如,使用 XML.load),而且未針對傳入資料配置足夠的記憶體,則裝置的作業系統可能會產生「記憶體失敗」錯誤。即使剩餘記憶體的總量足夠,仍可能發生這種情況。

例如,假設檔案嘗試載入 100 KB 的 XML 檔案,但裝置的作業系統只配置了 30 KB 來處理這個傳入資料串流。在這種情況下,Flash Lite 會對使用者顯示錯誤訊息,指出沒有足夠的記憶體可用。

若要載入大量的資料,請將資料分為較小的單位 (例如,以數個 XML 檔案為一單位),然後針對每個單位進行數次資料載入呼叫。每個資料單位的大小,以及因此而需要進行的資料載入呼叫次數,都會依裝置和檔案而異。若要在資料要求次數和記憶體失敗的可能性之間取得適當的平衡,請在各種目標裝置上測試檔案。

若要達到最佳效能,應盡可能避免載入和剖析 XML 檔案。反而要以簡單的名稱/值配對儲存資料,並使用 loadVars 從文字檔載入資料,或是從預先編譯的 SWF 檔案載入資料。

從 Flash Lite 編譯排除類別

若要減少 SWF 檔案的大小,請考慮從編譯排除類別,但保留在類別檢查時存取和使用類別的功能。例如,如果要開發使用多個 SWF 檔案或共用元件庫的檔案,特別是存取許多相同類別的檔案時,請嘗試這項作業。排除類別有助於避免在這些檔案中複製類別。

  1. 建立新 XML 檔。
  2. 將 XML 檔命名為 FLA_filename_exclude.xml,其中 FLA_filename 是指 FLA 檔的名稱,但不加 .fla 副檔名。例如,如果 FLA 檔是 sellStocks.fla,則 XML 檔名稱必須命名為 sellStocks_exclude.xml。
  3. 將檔案儲存在與 FLA 檔相同目錄中。
  4. 在 XML 檔中放置下列標籤:
    <excludeAssets>
    <asset name=”className1” />
    <asset name=”className2” />
    </excludeAssets>
    <excludeAssets> <asset name=”className1” /> <asset name=”className2” /> </excludeAssets>
    <excludeAssets> 
        <asset name=”className1” /> 
        <asset name=”className2” /> 
    </excludeAssets>

    <asset> 標籤中所指定的名稱屬性值,是應該從 SWF 檔案排除的類別名稱。盡可能為檔案加入所需的名稱。例如,下面的 XML 檔會從 SWF 檔中排除 mx.core.UIObjectmx.screens.Slide 類別:

    <excludeAssets>
    <asset name=”mx.core.UIObject” />
    <asset name=”mx.screens.Slide” />
    </excludeAssets>
    <excludeAssets> <asset name=”mx.core.UIObject” /> <asset name=”mx.screens.Slide” /> </excludeAssets>
    <excludeAssets> 
        <asset name=”mx.core.UIObject” /> 
        <asset name=”mx.screens.Slide” /> 
    </excludeAssets>

更快、更輕鬆地獲得協助

新的使用者?