Metin nesneleri oluşturma

Metin oluşturma performansını iyileştirmek için bitmap'leri arabelleğe alma özelliğini ve opaqueBackground özelliğini kullanın.

Flash Metin Motoru bazı mükemmel en iyileştirmeler sağlar. Ancak, bazı sınıfların tek bir metin satırı göstermesi beklenir. Bu sebepten dolayı, TextLine sınıfı ile düzenlenebilir bir metin alanı oluşturmak oldukça büyük miktarda bellek ve ActionScript kod satırı gerektirir. TextLine sınıfının en iyi kullanımı, daha hızlı oluşturmanın sağlanabilmesi ve daha az bellek gerektirmesinden dolayı statik ve düzenlenebilir olmayan metin için olandır.

Bitmap'leri arabelleğe alma özelliği, oluşturma performansını iyileştirmek için vektör içeriğini bitmap'ler gibi arabelleğe almanıza olanak verir. Bu özellik karmaşık vektör içeriği için ve oluşturulması için işleme gerektiren metin içeriğiyle kullanıldığında kullanışlıdır.

Aşağıdaki örnek bitmap'lerin arabelleğe alınması özelliğinin ve opaqueBackground özelliğinin oluşturma performansının iyileştirilmesi için nasıl kullanılabileceğini gösterir. Aşağıdaki resim kullanıcı bir şeyin yüklenmesini beklerken görüntülenebilecek sıkça rastlanan bir Hoş Geldiniz ekranını gösterir.

Grafiği tam boyut görüntüle
Hoş Geldiniz ekranı

Aşağıdaki resim TextField nesnesine programlanabilir bir şekilde uygulanan hareket hızını gösterir. Metin sahnenin üst kısmından ortasına kadar yavaşça hareket eder.

Grafiği tam boyut görüntüle
Metnin hareket hızı

Aşağıdaki kod hareket hızını oluşturur. preloader değişkeni geçerli hedef nesneyi performansı düşüren özellik aramalarını azaltmak için depolar.

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() işlevi daha fazla performans iyileştirilmesi almak ve işlev çağrılarının sayısını azaltmak için satır içine taşınabilir. Sabit noktalı değerlere sahip olmak açısından destX ve destY özellikleri için int türünü kullanmak iyi bir uygulamadır. Int türünün kullanılması değerleri Math.ceil() veya Math.round() gibi yavaş yöntemler üzerinden el ile yuvarlamak zorunda kalmadan mükemmel piksel yapışma elde etmenize olanak tanır. Değerlerin sürekli olarak yuvarlanması nesnenin düzgün hareket etmesini engellediği için bu kod, koordinatları tamsayıya yuvarlamaz. Nesne, koordinatlar her karedeki en yakın yuvarlanmış tamsayıya yapıştığından aksak hareket edebilir. Ancak bu teknik, bir görüntü nesnesinin son konumunu ayarlarken kullanışlı olabilir. Aşağıdaki kodu kullanmayın:

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

Aşağıdaki kod çok daha hızlıdır:

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

Önceki kod, değerlerin bölünmesi için bitsel geçiş sağlayan operatörlerin kullanımıyla daha da en iyileştirilebilir.

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

Bitmap'leri arabelleğe alma özelliği, çalışma zamanının nesneleri dinamik bitmap'ler kullanarak oluşturmasını kolaylaştırır. Bu örnekte, TextField nesnesini içeren film klibi arabelleğe alınır:

wait_mc.cacheAsBitmap = true;

Performansı iyileştirmenin ek bir yolu alfa şeffaflığını kaldırmaktır. Alfa şeffaflığı, önceki koddaki gibi saydam bitmap görüntüleri çizerken çalışma zamanının üzerine ek bir yük koyar. Onu devre dışı bırakmak için arka plan olarak bir renk belirleyerek opaqueBackground özelliğini kullanabilirsiniz.

Bellekte oluşturulan bitmap yüzeyi opaqueBackground özelliğini kullanırken de 32 bit kullanır. Ancak, alfa uzaklık değeri 255 olarak ayarlanır ve saydamlık kullanılmaz. Sonuç olarak, opaqueBackground özelliği bellek kullanımını azaltmaz ancak bitmap'leri arabelleğe alma özelliğini kullanırken oluşturma performansını iyileştirir. Aşağıdaki kod en iyileştirmelerinin tümünü kapsar:

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

Animasyon artık en iyileştirilmiştir ve saydamlığın kaldırılmasıyla bitmap'lerin önbelleğe alınması da en iyileştirilmiştir. Mobil aygıtlarda, bitmap önbelleğe alma özelliğini kullanırken farklı animasyon durumlarında Sahne Alanı kalitesini LOW ve HIGH olarak değiştirmeyi düşünün:

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

Ancak, bu durumda, Sahne Alanı kalitesinin değiştirilmesi çalışma zamanının geçerli Sahne Alanı kalitesiyle eşleşmesi için TextField nesnesinin bitmap yüzeyini yeniden oluşturmaya zorlar. Bu sebepten dolayı, bitmap'leri arabelleğe alma özelliğini kullanırken Sahne Alanı kalitesini değiştirmemek en iyisidir.

Burada bitmap'lerin arabelleğe alınmasının elle yapılması gibi bir yaklaşım denenebilir. opaqueBackground özelliğini taklit etmek için, film klibi saydam olmayan bir BitmapData nesnesine çizilebilir; bu çalışma zamanını bitmap yüzeyini yeniden oluşturmaya zorlamaz.

Bu teknik zamanla değişmeyen içerik için kullanışlıdır. Ancak, metin alanının içeriği değişebiliyorsa, farklı bir strateji kullanmayı deneyin. Örneğin, uygulamanın ne kadarının yüklendiğini temsil eden bir yüzde ile devamlı güncellenen bir metin alanı düşünün. Metin alanı veya onu içeren görüntüleme nesnesi bir bitmap olarak arabelleğe alınmışsa, yüzeyi içerik her değiştiğinde yeniden oluşturulmalıdır. Görüntüleme nesnesi içeriği devamlı değiştiği için burada bitmap'leri el ile önbelleğe alamazsınız. Bu sürekli değişim, sizi BitmapData.draw() yöntemini önbelleğe alınmış bitmap’i güncellemek için el ile çağırmaya zorlayabilir.

Flash Player 8’den (ve AIR 1.0) itibaren, Sahne Alanı kalitesinin değeri fark etmeksizin, oluşturması Okunabilirlik için Kenar Yumuşatma’ya ayarlı olan bir metin alanı eksiksiz bir şekilde kenar yumuşatmalı olarak kalır. Bu yaklaşım daha az bellek tüketir ancak daha fazla CPU işleme gerektirir ve bitmap'leri arabelleğe alma özelliğine kıyasla daha yavaş bir oluşturma sağlar.

Aşağıdaki kod bu yaklaşımı kullanır:

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

Hareket halinde olan bir metin için bu seçeneği (Okunabilirlik için Kenar Yumuşatma) kullanmanız tavsiye edilmez. Metin ölçeklendirilirken, bu seçenek metnin hizalı kalmaya çalışmasına sebep olur, bu da bir kayma efekti yaratır. Ancak, görüntüleme nesnesinin içeriği devamlı değişiyorsa ve ölçeklendirilmiş bir metne ihtiyacınız varsa, kaliteyi LOW olarak ayarlayarak mobil uygulamalarda performansı artırabilirsiniz. Hareket bittiğinde kaliteyi yeniden HIGH olarak değiştirin.