使用點陣圖快取功能與
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
。