Återge textobjekt

Använd bitmappscachningfunktionen och egenskapen opaqueBackground för att få bättre textåtergivning.

Flash-textmotorn har ett antal mycket bra optimeringar. Det krävs emellertid flera klasser för att visa en rad med text. Detta medför att det krävs mycket minnekapacitet och många rader med ActionScript-kod när du skapar ett redigeringsbart textfält med klassen TextLine. Klassen TextLine är bäst lämpad för statisk och icke-redigeringsbar text, där den återges snabbare och är mindre minneskrävande.

I funktionen för bitmappscachning kan du cache-lagra innehåll såsom bitmappar för att förbättra återgivningsprestandan. Den här funktionen är användbar för avancerat vektorinnehåll, men även för textinnehåll som kräver bearbetning ska återges.

I följande exempel visas hur bitmappscachningfunktionen och egenskapen opaqueBackground kan användas för att förbättra återgivningsprestandan. I bilden nedan visas en vanlig välkomstbild som kan visas när en användare väntar på att något ska läsas in:

I nästa bild visas övergången som används för objektet TextField programmatiskt. Textövergången sker sakta från scenöverkanten mot mitten:

Med följande kod skapas övergången. I variabeln preloader lagras det aktuella målobjektet för att minimera egenskapssökningar, som kan försämra prestandan:

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 ); 
}

Funktionen Math.abs() kan göras textbunden och flyttas hit för att minska antalet funktionsanrop och för att få ytterligare prestandaförbättringar. Det bästa är att använda typen int för egenskaperna destX - och destY så att du får fasta punktvärden. När du använder typen int får du perfekt pixelfästning utan att behöva avrunda värden manuellt i långsamma metoder som Math.ceil() eller Math.round() . Denna kod avrundar inte koordinaterna till heltal eftersom objekten inte kommer att förflytta sig med mjuka rörelser när värdena avrundas på detta sätt. Rörelserna kan bli ryckiga eftersom koordinaterna fäster mot närmaste avrundade heltal i varje bildruta. Den här tekniken kan emellertid vara användbar när det gäller att fastställa den slutgiltiga positionen för ett visningsobjekt. Använd inte följande kod:

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

Följande kod är mycket snabbare:

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

Den föregående koden kan optimeras ytterligare med hjälp av operatorer för bitvis växling för att dividera värdet.

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

Med funktionen för bitmappscachning är det enklare att återge objekt med hjälp av dynamiska bitmappar. I det aktuella exemplet är filmklippet med TextField-objektet cache-lagrat:

wait_mc.cacheAsBitmap = true;

Ytterligare ett sätt att förbättra prestandan är att ta bort alfagenomskinlighet. Alfagenomskinlighet belastar körningsmiljön ytterligare vid uppritning av genomskinliga bitmappsbilder, vilket visades i föregående kod. Du kan använda egenskapen opaqueBackground för att gå förbi detta och ange en speciell bakgrundsfärg.

När du använder egenskapen opaqueBackground kommer fortfarande 32 bitar att användas för bitmappsytan som skapades i minnet. Alfaförskjutningen är emellertid angiven som 255 och ingen genomskinlighet kommer att användas. Detta resulterar inte i att minnesanvändningen för opaqueBackground -egenskapen kommer att minska, men återgivningsprestandan kommer att förbättras när funktionen för bitmappscachning används. I följande kod finns alla optimeringarna:

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 ); 
}

Animeringen är nu optimerad och bitmappscachningen har optimerats genom att genomskinligheten tagits bort. På mobilenheter bör du överväga om du ska ändra scenkvaliteten till LOW och HIGH under olika lägen i animeringen när du använder funktionen för bitmappscachning:

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 ); 
    } 
}

I det här fallet innebär emellertid en förändring av scenkvaliteten att bitmappsytan för TextField-objektet måste genereras om för att matcha den aktuella scenkvaliteten. Av denna anledning är det bäst att inte ändra scenkvaliteten när du använder funktionen för bitmappscachning.

En manuell bitmappscachning skulle ha använts här i stället. Om du vill simulera egenskapen opaqueBackground kan du rita upp filmklippet på ett icke-genomskinligt BitmapData-objekt, vilket medför att bitmappsytan inte behöver genereras om.

Den här tekniken fungerar bra för innehåll som inte förändras över tiden. Om emellertid innehållet i textfältet kan ändras ska du överväga att använda en annan strategi. Tänk dig exempelvis ett textfält som uppdateras kontinuerligt med en procentsats som visar hur mycket programmet har läst in. Om textfältet, eller dess visningsobjekt, har cache-lagrats som en bitmapp måste dess yta genereras om varje gång som innehållet ändras. Du kan inte använda manuell bitmappscachning här eftersom visningsobjektet ständigt förändras. Denna ständiga förändring tvingar dig till att manuellt anropa metoden BitmapData.draw() för att uppdatera den cache-lagrade bitmappen.

Tänk på att ett textfält, där återgivningen är inställd på Kantutjämna för läsbarhet (oavsett värdet på scenkvaliteten), förblir perfekt kantutjämnat från och med Flash Player 8 (och AIR 1.0). Detta arbetssätt leder till mindre minnesförbrukning men det kräver mer processorbearbetning och återgivningen sker något långsammare är om funktionen för bitmappscachning används.

I följande kod används detta arbetssätt:

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 ); 
    } 
}

Att använda det här alternativet (Kantutjämna för läsbarhet) för text som rör sig är inte att rekommendera. När texten skalas medför detta alternativ att den försöker förbli justerad, vilket resulterar i en skiftningseffekt. Om visningsobjektets innehåll däremot ändras kontinuerligt, och du behöver skala texten, kan du förbättra prestandan i mobilprogram genom att ställa in kvaliteten på LOW . När rörelsen har avslutats återställer du kvaliteten till HIGH .