2012-02-28 6 views
0

내가 디버그 플레이어의 '쇼 업데이트 지역'기능을 사용하여 BitmapData.drawAS3 stagesized 비트 맵 업데이트 지역

를 사용하여 stageSized 비트 맵에 그리기있어 프로젝트가, 나는 플레이어 것을 알 수 있습니다 비트 맵 데이터의 작은 부분 만 변경했지만 항상 전체 스테이지를 업데이트합니다.

어떻게하면 플레이어가 비트 맵 데이터가 변경된 부분의 화면 만 업데이트하도록 할 수 있습니까?

+0

몇 가지 비트 맵으로 분할해야합니다. 그 정상은 당신이 draw 함수를 사용한다면 다시 전체 객체를 칠한다는 것을 의미합니다. – turbosqel

+0

지금 당장이 작업을하고 있지만 훨씬 빠릅니다. 그러나 설명 할 수없는 매우 이상한 그래픽 결함이 발생합니다. 페인팅하는 동안 비트 맵의 ​​작은 부분 만 실제로 화면에 그려집니다. 비트 맵 데이터에 비트 맵 데이터를 올바르게 추가했음을 알 수 있지만, 일부는 화면에 표시되지 않습니다. – Mat

+0

좋습니다 - 이제 작동 중입니다. 무승부를 사용하기 전에 bitmapdatas를 잠근 다음 잠금 해제를 호출하면 이상한 결함이 발생하지 않습니다. 지금은 빠르다 =) – Mat

답변

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에서 "다시 그리기 영역 표시"로이 시도하고 당신은 각 틱에만 새로 그려 부분을 업데이트 볼 수 있습니다 :

현재 작업에서 볼 수 있습니다.

+0

테스트에서 BitmapData.draw 메소드를 사용하고 있지 않습니다. 그게 대상 비트 맵의 ​​임의의 크기 영역을 변경할 수 있기 때문에 FP는 다시 그리기를 결정하는 데 어려움이 있습니다. –

+0

draw()를 사용하도록 코드를 업데이트했습니다. 아직도 작동합니다. 나는 네가 네 문제를 해결 한 것을 본다. – Manish

0

대신 copyPixels를 사용할 수 있습니까? 다른 BitmapData에서 복사 만 할 수 있지만 대부분의 경우 괜찮습니다. (애니메이션을 비트 맵 데이터로 한 번 캐시 한 다음 Draw-method 대신 캐시 된 데이터를 사용할 수 있습니다.) FlashPlayer는 copyPixels를 사용할 때 변경된 부분 만 다시 그릴 수 있어야합니다.

그러나 실제 질문은; 이게 진짜 문제 야? 실제로 필요하지 않는 한 이러한 것들을 최적화하지 마십시오.

+0

변환 행렬을 적용하므로 그리기가 필요합니다. 그리고 네, 중요한 성과를 올렸습니다. 이미지를 여러 개의 작은 그리드로 분할하면 성능이 10 배 향상됩니다 (그러나이 메서드를 사용하여 매우 이상한 그래픽 결함이 발생하는 순간) – Mat

관련 문제