Почему приложение AIR для настольных компьютеров медленнее, чем автономный проигрыватель Flash Player? - PullRequest
0 голосов
/ 20 апреля 2011

следующая программа создает фон, состоящий из 2 слоев - растеризованной заливки и повторяющейся растровой заливки с режимом смешивания Multiply сверху. при щелчке окно переключается между полноэкранным режимом и режимом окна, соответствующим образом корректирует размер фона и затемнеет от черного с помощью Tweener.

когда я запускаю программу напрямую с помощью автономного проигрывателя Flash Player (10.2), анимация постепенного исчезновения очень плавная как в полноэкранном, так и в оконном режиме. но когда я запускаю приложение как приложение AIR (2.5), анимация затухания заметно отстает, становится прерывистой.

Я разработал приложение, используя Flash Professional CS5. Я пробовал публиковать со всеми 3 вариантами аппаратного ускорения (нет, Direct, GPU), но нет никакой разницы. я считаю, что код оптимизирован настолько, насколько это возможно, для анимации экранных объектов путем преобразования их в растровые изображения.

Я запускаю код как в автономном Flash Player 10.2, так и в AIR 2.6 (хотя приложение опубликовано для 2.5 SDK) в Mac OS X 10.6.7 с 27-дюймовым iMac @ 3,06 ГГц Intel Core 2 Duo и 4 ГБ оперативной памяти. У меня нет доступа к тестированию в Windows или Linux.

ниже - это основной класс документа, прикрепленный во встроенном .png, который я использовал ("Background.png") в коде.

package
{
//Imports
import com.caurina.transitions.Equations;
import com.caurina.transitions.Tweener;
import flash.display.Bitmap;
import flash.display.BlendMode;
import flash.display.BitmapData;
import flash.display.PixelSnapping;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.filters.BlurFilter;
import flash.geom.Matrix;

//SWF Metadata Tag
[SWF (width = "1000", height = "500", frameRate = "60", backgroundColor = "0x000000")]

//Class
public class FullScreenFadeTest extends Sprite
    {
    //Constants
    private static const MIN_WINDOW_WIDTH:uint = 480;
    private static const MIN_WINDOW_HEIGHT:uint = 320;
    private static const BLUR_AMOUNT:uint = 150;

    //Variables
    [Embed (source = "Background.png")]
    private var ImageAsset:Class;

    private var backgroundFillShape:Shape;
    private var backgroundFillBitmap:Bitmap;
    private var backgroundFillBitmapData:BitmapData;
    private var backgroundTexture:Shape;
    private var canvas:Sprite;
    private var faderShape:Shape;
    private var faderBitmap:Bitmap;
    private var faderBitmapData:BitmapData;
    private var fader:Sprite;

    //Constructor
    public function FullScreenFadeTest()
        {
        stage.scaleMode = StageScaleMode.NO_SCALE;
        stage.align = StageAlign.TOP_LEFT;

        init();
        }

    //Initialize
    private function init():void
        {
        backgroundFillShape = new Shape();
        backgroundFillShape.graphics.beginFill(0x7F7F7F, 1.0);
        backgroundFillShape.graphics.drawRect(-(MIN_WINDOW_WIDTH + BLUR_AMOUNT * 2) / 2, -(MIN_WINDOW_HEIGHT + BLUR_AMOUNT * 2) / 2, MIN_WINDOW_WIDTH + BLUR_AMOUNT * 2, MIN_WINDOW_HEIGHT + BLUR_AMOUNT * 2);
        backgroundFillShape.graphics.endFill();
        backgroundFillShape.graphics.beginFill(0xFFFFFF, 1.0);
        backgroundFillShape.graphics.drawEllipse(-MIN_WINDOW_WIDTH * 0.75 / 2, -MIN_WINDOW_HEIGHT * 0.5 / 2, MIN_WINDOW_WIDTH * 0.75, MIN_WINDOW_HEIGHT * 0.5);
        backgroundFillShape.graphics.endFill();
        backgroundFillShape.filters = [new BlurFilter(BLUR_AMOUNT, BLUR_AMOUNT, 3)];

        backgroundFillBitmapData = new BitmapData(MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT);
        backgroundFillBitmapData.draw(backgroundFillShape, new Matrix(1, 0, 0, 1, MIN_WINDOW_WIDTH / 2, MIN_WINDOW_HEIGHT / 2));

        backgroundFillBitmap = new Bitmap(backgroundFillBitmapData, PixelSnapping.NEVER, true);
        backgroundFillBitmap.width = stage.stageWidth;
        backgroundFillBitmap.height = stage.stageHeight;

        backgroundTexture = new Shape();
        backgroundTexture.graphics.beginBitmapFill(backgroundFillBitmapData = (new ImageAsset()).bitmapData);
        backgroundTexture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
        backgroundTexture.graphics.endFill();
        backgroundTexture.blendMode = BlendMode.MULTIPLY;

        canvas = new Sprite();
        canvas.addChild(backgroundFillBitmap);
        canvas.addChild(backgroundTexture);

        faderShape = new Shape();
        faderShape.graphics.beginFill(0x000000, 1.0);
        faderShape.graphics.drawRect(0, 0, 1, 1);
        faderShape.graphics.endFill();

        faderBitmapData = new BitmapData(1, 1);
        faderBitmapData.draw(faderShape);

        faderBitmap = new Bitmap(faderBitmapData, PixelSnapping.NEVER);
        faderBitmap.width = stage.stageWidth;
        faderBitmap.height = stage.stageHeight;

        fader = new Sprite();
        fader.addChild(faderBitmap);
        fader.alpha = 0.0;

        addChild(canvas);
        addChild(fader);

        stage.addEventListener(MouseEvent.CLICK, toggleDisplayState);
        }


    //Toggle Display State
    private function toggleDisplayState(evt:MouseEvent):void
        {
        if  (!Tweener.isTweening(fader))
            {
            if  (stage.displayState == StageDisplayState.NORMAL)
                stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
                else
                stage.displayState = StageDisplayState.NORMAL;

            backgroundTexture.graphics.clear();
            backgroundTexture.graphics.beginBitmapFill(backgroundFillBitmapData);
            backgroundTexture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            backgroundTexture.graphics.endFill();

            backgroundFillBitmap.width = fader.width = stage.stageWidth;
            backgroundFillBitmap.height = fader.height = stage.stageHeight;

            fader.alpha = 1.0;

            Tweener.addTween(fader, {time: 1.0, delay: 1.0, transition: Equations.easeInOutCubic, alpha: 0.0});
            }
        }
    }
}

Background

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...