AS3分阶段化了位图和更新区域

时间:2012-02-28 19:45:45

标签: performance actionscript-3

我有一个项目,我使用BitmapData.draw绘制到stageSized位图

使用调试播放器的“显示更新区域”功能,我可以看到播放器始终更新整个舞台,尽管我只更改了位图数据的一小部分。

我可以以某种方式让播放器只更新屏幕中对位图数据进行更改的部分吗?

2 个答案:

答案 0 :(得分:0)

如果您只是重绘部分位图,那么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中的“显示重绘区域”,您将看到它仅更新每个刻度上新绘制的部分。

答案 1 :(得分:0)

是否可以使用copyPixels?它只允许从另一个BitmapData复制,但大部分时间应该没问题(你总是可以将动画缓存到bitmapdata一次,然后使用缓存数据而不是Draw方法)。使用copyPixels时,Flash播放器应该只能重绘已更改的部分。

然而,真正的问题;这真的是一个问题吗?除非你真的需要:)

,否则不要优化这些东西