AS3 поэтапный битмап и регионы обновления - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть проект, в котором я рисую в растровое изображение stageSized с помощью BitmapData.draw

с помощью функции «показать области обновления» проигрывателя отладки, я вижу, что проигрыватель всегда обновляет всю стадию, хотя я изменил только небольшую часть растровых данных.

Можно ли как-то заставить проигрыватель обновлять только ту часть экрана, где были внесены изменения в растровые данные?

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Можно ли вместо этого использовать copyPixels? Он позволяет копировать только из другого BitmapData, но в большинстве случаев это нормально (вы всегда можете кэшировать анимацию в bitmapdata один раз, а затем использовать кэшированные данные вместо Draw-метода). Flash Player должен перерисовывать только измененные части при использовании copyPixels.

Однако реальный вопрос; это действительно проблема? Не оптимизируйте эти вещи, если вам на самом деле не нужно:)

0 голосов
/ 29 февраля 2012

Если вы перерисовываете только часть растрового изображения, Flash Player должен обновлять только эту часть.

Вы можете увидеть это в действии здесь:

public class Test extends Sprite
{
    public function Test()
    {
        stage.align = "topLeft";
        stage.scaleMode = "noScale";

        var bitmap:Bitmap = new Bitmap();
        addChild(bitmap);

        var bd:BitmapData = new BitmapData(400, 400);
        bitmap.bitmapData = bd;

        // One-second timer.
        var timer:Timer = new Timer(1000);
        timer.start();
        timer.addEventListener("timer", timerHandler);
    }

    private function timerHandler(event:Event):void
    {
        var bitmap:Bitmap = Bitmap(getChildAt(0));
        var bd:BitmapData = bitmap.bitmapData;

        // Draw 100x100 square in random location, with random color.    
        var xPos:Number = Math.random() * 300;
        var yPos:Number = Math.random() * 300;

        var matrix:Matrix = new Matrix(1, 0, 0, 1, xPos, yPos);

        var color:uint = Math.round(Math.random() * 0xFFFFFF) | 0xFF000000;

        var colorTransform:ColorTransform = new ColorTransform();
        colorTransform.color = color;

        var shape:Shape = new Shape();

        var g:Graphics = shape.graphics;

        g.beginFill(0xFFFFFF);
        g.drawRect(0, 0, 100, 100);
        g.endFill();

        bd.draw(shape, matrix, colorTransform);
    }
}

Попробуйте это с «Показать перерисованные области» в автономном Flash Player, и вы увидите, что он обновляет только вновь нарисованную часть на каждом тике.

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