Flash 平台技術的最佳化(十三) 呈現文字物件

來源:互聯網
上載者:User

使用位元影像緩衝功能和 opaqueBackground 屬性可提高文本呈現效能。


Flash Player10 中的新文本引擎提供了一些出色的最佳化功能。但是,需要使用許多類才能顯示單個文本行。為此,使用TextLine 類建立可編輯的文字欄位需要大量記憶體和許多行 ActionScript 代碼。TextLine 類最適合靜態文本和不可編輯的文本,它們能夠以更快的速度呈現並佔用更少的記憶體。
藉助位元影像緩衝功能,您可以將向量內容緩衝為位元影像來提高呈現效能。此功能對於複雜向量內容以及需要進行處理才能呈現的常值內容都很有用。

以下代碼建立緩動。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() 函數,以減少函數的調用次數並獲得更多的效能改進。最佳做法是使用 destX 屬性和destY 屬性的整數類型,以便擁有固定點值。通過使用整數類型,您可以獲得完美的像素貼緊,而無需使用較慢的方法(如Math.ceil() 或Math.round())手動對值進行四捨五入。此代碼不會將座標四捨五入為整數,因為不斷對值進行四捨五入會使對象不能平滑移動。此對象可能不會平滑移動,因為座標已採用各個幀上最接近的四捨五入的整數。然而,此技術在設定顯示對象的最終位置時可能非常有用。不要使用以下代碼:

// 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;
藉助位元影像緩衝功能, Flash Player 可以更輕鬆地使用動態位元影像呈現對象。在當前樣本中,緩衝了包含 TextField 對象的影片剪輯:
wait_mc.cacheAsBitmap = true;
提高效能的另一種方式是刪除 alpha 透明度。在繪製透明位元影像映像時,Alpha 透明度增加了 Flash Player 的負荷,如上一代碼中所示。您可以使用 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 );
}
}
但是,在這種情況下,更改舞台品質會強制 Flash Player 重建 TextField 對象的位元影像表面以與當前舞台品質匹配。因此,最好不要在使用位元影像緩衝功能時更改舞台品質。
此處可能已經使用了手動位元影像緩衝方法。要類比 opaqueBackground 屬性,可將影片剪輯繪製為非透明的 BitmapData 對象,這樣不會強制 Flash Player 重建位元影像表面。
此技術適用於不隨時間更改的內容。但是,如果文字欄位的內容可以更改,請考慮使用其他策略。例如,假設一個文字欄位以某個百分比不斷進行更新來表示應用程式的載入量。如果該文字欄位或其包含的顯示對象緩衝為位元影像,則每次內容更改時必鬚生成其表面。在此處無法使用手動位元影像緩衝,因為顯示對象內容不斷更改。此常量更改將強制手動調用 BitmapData.draw() 方法以更新緩衝的位元影像。請記住,在 Flash Player 8 及更高版本中,無論 Stage 品質值如何,呈現設定為“ 可讀性消除鋸齒” 的文字欄位會始終保持完全消除鋸齒狀態。此方法佔用的記憶體較少,但是需要更多的 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。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.