顯示文字物件

使用點陣圖快取功能與 opaqueBackground 屬性,可改善文字顯示。

Flash 文字引擎提供一些很好的最佳化。不過,需要許多類別來顯示單一文字行。因此,使用 TextLine 類別來建立可編輯的文字欄位,需要大量的記憶體和許多行的 ActionScript 程式碼。TextLine 類別最適合用於靜態與不可編輯的文字,因為它的顯示速度較快且需要的記憶體較少。

點陣圖快取功能可讓您快取向量內容做為點陣圖,以改善顯示效能。這項功能對於複雜的向量內容很有幫助;另外,與需要顯示處理的文字內容搭配使用時也很有用。

下列範例顯示如何使用快取功能與 opaqueBackground 屬性,以改善顯示效能。下圖說明典型的「歡迎螢幕」,可在使用者等待載入程式時顯示:

下圖說明以程式設計方式套用至 TextField 物件的加/減速。文字會從場景的頂端慢慢地加/減速至場景的中央:

檢視完整大小的圖形
文字的加/減速

下列程式碼會產生加/減速。 preloader 變數會儲存目前的目標物件以減少屬性查閱,而這將影響效能:

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); 
  
var destX:Number=stage.stageWidth/2; 
var destY:Number=stage.stageHeight/2; 
var preloader:DisplayObject; 
  
function movePosition( e:Event ):void 
{ 
    preloader = e.currentTarget as DisplayObject; 
     
    preloader.x -= ( preloader.x - destX ) * .1; 
    preloader.y -= ( preloader.y - destY ) * .1; 
     
    if (Math.abs(preloader.y-destY)<1) 
        preloader.removeEventListener( Event.ENTER_FRAME, movePosition ); 
}

Math.abs() 函數可以移到此處以減少函數呼叫的數目,以進一步改進效能。最好的方法是使用 int 類型的 destX destY 屬性,這樣您便會取得定點值。使用 int 類型可讓您取得理想的像素貼齊,而不必透過緩慢的方法 (例如 Math.ceil() Math.round() ) 來手動四捨五入該值。此程式碼不會將座標四捨五入為 int,因為持續把值四捨五入會使物件無法平滑地移動。物件可能會以跳動的方式移動,因為每個影格上的座標會變成四捨五入後的整數值。不過設定顯示物件的最終位置時,此技巧則非常實用。請勿使用下列程式碼:

// Do not use this code 
var destX:Number = Math.round ( stage.stageWidth / 2 );  
var destY:Number = Math.round ( stage.stageHeight / 2); 

下列程式碼的執行速度快許多:

var destX:int = stage.stageWidth / 2;  
var destY:int = stage.stageHeight / 2; 

前面的程式碼甚至可以進一步最佳化,方法是使用位元位移運算子來分割值:

var destX:int = stage.stageWidth >> 1;  
var destY:int = stage.stageHeight >> 1;

點陣圖快取功能透過使用動態點陣圖,讓執行階段更容易顯示物件。在目前的範例中,會快取包含 TextField 物件的影片片段:

wait_mc.cacheAsBitmap = true;

改善效能的其中一種方式是移除 Alpha 透明度。繪製透明的點陣圖影像時,Alpha 透明度會增加執行階段的額外負擔,如前面的程式碼所示。透過將顏色指定為背景,您可以使用 opaqueBackground 屬性來略過它。

使用 opaqueBackground 屬性時,在記憶體中建立的點陣圖表面仍然會使用 32 位元。但會將 Alpha 偏移設定為 255,而且不會使用任何透明度效果。因此, opaqueBackground 屬性不會降低記憶體使用率,但是它會在使用點陣圖快取功能時改善顯示效能。下列程式碼包含所有的最佳化:

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); 
wait_mc.cacheAsBitmap = true; 
  
// Set the background to the color of the scene background 
wait_mc.opaqueBackground = 0x8AD6FD; 
var destX:int = stage.stageWidth >> 1; 
var destY:int = stage.stageHeight >> 1; 
var preloader:DisplayObject; 
  
function movePosition ( e:Event ):void 
{ 
    preloader = e.currentTarget as DisplayObject; 
     
    preloader.x -= ( preloader.x - destX ) * .1; 
    preloader.y -= ( preloader.y - destY ) * .1; 
     
    if ( Math.abs ( preloader.y - destY ) < 1 ) 
        e.currentTarget.removeEventListener ( Event.ENTER_FRAME, movePosition ); 
}

動畫現在已最佳化,而且透過移除透明度將點陣圖快取最佳化。在行動裝置上,於使用點陣圖快取功能期間,請考慮在動畫的不同狀態期間,將「舞台」品質切換為 LOW HIGH

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); 
wait_mc.cacheAsBitmap = true; 
wait_mc.opaqueBackground = 0x8AD6FD; 
  
// Switch to low quality 
stage.quality = StageQuality.LOW; 
var destX:int = stage.stageWidth>>1; 
var destY:int = stage.stageHeight>>1; 
var preloader:DisplayObject; 
  
function movePosition( e:Event ):void 
{ 
    preloader = e.currentTarget as DisplayObject; 
     
    preloader.x -= ( preloader.x - destX ) * .1; 
    preloader.y -= ( preloader.y - destY ) * .1; 
     
    if (Math.abs(e.currentTarget.y-destY)<1) 
    { 
        // Switch back to high quality 
        stage.quality = StageQuality.HIGH; 
        preloader.removeEventListener( Event.ENTER_FRAME, movePosition ); 
    } 
}

不過,在此情況下,變更「舞台」品質會強制執行階段重新產生 TextField 物件的點陣圖表面,以符合目前的「舞台」品質。因此,使用點陣圖快取功能時,最好不要變更「舞台」品質。

在這裡可能已經使用過手動點陣圖快取方法。若要模擬 opaqueBackground 屬性,可以將影片片段繪製到非透明的 BitmapData 物件,這不會強制執行階段重新產生點陣圖表面。

這項技巧非常適用於不會隨著時間而變更的內容。不過,如果文字欄位的內容有可能變更,請考慮使用其他策略。例如,想像有一個文字欄位,其內容持續更新成代表已載入應用程式的百分比。如果文字欄位或是所含的顯示物件已快取為點陣圖,則每次內容變更時,就必須產生其表面。您無法在此使用手動點陣圖快取,因為顯示物件的內容持續在變更。此常數變更會強制您手動呼叫 BitmapData.draw() 方法來更新快取的點陣圖。

請記住,自 Flash Player 8 (與 AIR 1.0) 起 (不論「舞台」品質值為何),顯示設定為「消除鋸齒增加易讀性」的文字欄位仍然會完全消除鋸齒。這個方法耗用較少的記憶體,但是它需要更多的 CPU 處理,而且其顯示速度比點陣圖快取功能慢一點。

下列程式碼使用此方式:

wait_mc.addEventListener( Event.ENTER_FRAME, movePosition ); 
  
// Switch to low quality 
stage.quality = StageQuality.LOW; 
var destX:int = stage.stageWidth >> 1; 
var destY:int = stage.stageHeight >> 1; 
var preloader:DisplayObject; 
function movePosition ( e:Event ):void 
{ 
    preloader = e.currentTarget as DisplayObject; 
     
    preloader.x -= ( preloader.x - destX ) * .1; 
    preloader.y -= ( preloader.y - destY ) * .1; 
     
    if ( Math.abs ( preloader.y - destY ) < 1 ) 
    { 
        // Switch back to high quality 
        stage.quality = StageQuality.HIGH; 
        preloader.removeEventListener ( Event.ENTER_FRAME, movePosition ); 
    } 
}

不建議對移動文字使用此選項 (消除鋸齒增加易讀性)。縮放文字時,此選項會讓文字嘗試對齊,這會產生位移效果。不過,如果顯示物件的內容持續變更,而且您需要縮放文字,可以將品質設定為 LOW ,以改善行動應用程式的效能。移動完成時,請將品質切換回 HIGH