2012-02-28 28 views
0

我有一个项目中,我正在使用的“显示更新区域”调试播放器的功能使用的BitmapData.drawAS3 stagesized位图和更新区域

绘制一个stageSized位图,我可以看到玩家总是更新整个阶段,虽然我只改变了bitmapdata的一小部分。

我可以以某种方式让播放器只更新屏幕上位图数据发生更改的部分吗?

+0

你必须将它分割为几个位图。它正常的,如果你使用绘图功能,它再次绘制整个对象。 – turbosqel 2012-02-28 20:07:52

+0

我现在正在做这件事,速度要快很多 - 但是,我得到了很奇怪的图形故障,我无法解释。在绘画时,只有小部分位图实际上被绘制到屏幕上。如果稍后我在相同的区域上绘画,我可以看到之前的笔画已正确添加到位图数据中,但并非全部都在屏幕上显示。 – Mat 2012-02-29 03:45:41

+0

好 - 现在它正在工作。如果我在使用draw之前锁定bitmapdatas然后调用unlock,那么我不会得到那些奇怪的故障。现在它很快=) – Mat 2012-02-29 04:25:54

回答

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播放器“显示重绘区域”试试这个,你会看到它在每个刻度仅更新新绘制的一部分。

+0

虽然您的测试未使用BitmapData.draw方法。我想,因为这可以改变目标位图的任意大小的区域,所以FP难以决定要重绘的内容。 – 2012-02-28 22:38:17

+0

我更新了使用draw()的代码。仍然有效。我看到你解决了你的问题,这很好。 – Manish 2012-03-02 01:42:43

0

是否可以使用copyPixels代替?它只允许从另一个BitmapData复制,但大部分时间应该没问题(您可以将动画缓存到bitmapdata一次,然后使用缓存数据而不是Draw-method)。当您使用copyPixels时,Flash Player应该只能重新绘制已更改的部分。

然而,真正的问题;这真的是一个问题吗?不要优化这些东西,除非你真的需要:)

+0

我应用了一个转换矩阵,所以我需要绘制。是的,这是一个重大的性能问题。如果我将图像分成几个较小的网格,那么性能会好10倍(但是,此时我正在使用此方法遇到非常奇怪的图形故障) – Mat 2012-02-29 03:44:16