[UPL003] BitmapData 픽셀 드로잉&CS4 3D 랜더링 속도

Project/UPL 2009. 8. 5. 21:17


9000개의 픽셀을 이용하여 BitmapData에 드로잉하는 속도는 기존의 플래시플레이어에서는 상상도 할 수 없는 속도를 낸다. 물론 단순한 setPixel을 통한 색 변환 비주얼이지만...



    

설정

트랙백

댓글

  • 에어플랜 2009.08.06 09:40 ADDR 수정/삭제 답글

    오늘도 잘보고 가네요^^

  • Q 2009.08.06 11:02 ADDR 수정/삭제 답글

    와 멋집니다! :)

  • 지돌스타 2009.08.06 11:19 ADDR 수정/삭제 답글

    역시 멋집니다.
    BitmapData로 저렇게 멋진 결과물을 뽑으시다니~~ ^^

    • jasu 2009.08.07 00:02 신고 수정/삭제

      사실 비트맵 관련하여 오픈된 알고리즘은 인터넷에 널려있죠. 그걸 어떻게 활용하느냐에 따라서 정보로서의 가치가 새로워지는 것이 아닐까 싶네요 ^^ 아무튼 말씀 감사합니다.

  • 리노아 2009.08.06 14:03 ADDR 수정/삭제 답글

    오~ 마우스 나갔을때 멈추게 되는 디테일함이 ^ ^

    • jasu 2009.08.07 00:04 신고 수정/삭제

      stage.addEventListener(Event.ACTIVATE, onActivateHandler);
      stage.addEventListener(Event.DEACTIVATE, onDeactivateHandler);

      참 쉽죠잉~ 쿠쿠

  • lovedev 2009.08.08 15:41 ADDR 수정/삭제 답글

    난 이런거 만드는 사람들이 제일 부러워요 ^^;;

    • jasu 2009.08.09 05:05 신고 수정/삭제

      충분히 할 수 있는 능력을 가진 분이 그런말 하시면 흥이 안납니다 ^^ 조만간 뵙죠

  • 쿠나 2009.08.09 08:03 ADDR 수정/삭제 답글

    프로그래밍으로 코딩해도 이런 결과물 뽑기 참 힘들텐데.. 단순 BitmapData로 저렇게 만드셨다니 참 대단하십니다 =ㅅ= ;;;.. 프레임도 상당히 잘나오네요 ㅎㅎ

    • jasu 2009.08.12 16:27 신고 수정/삭제

      비트맵으로 할 수 있는 놀이는 다양하겠죠^^ 이런 류의 소스가 많이 있습니다. 응용해보면 재미있는 효과도 만들 수 있을거에요

[AS3] BitmapData.lock and unlock 기능

Programming/ActionScript 3.0 2007. 9. 3. 09:45
BitmapData에 있는 lock/unlock 메소드는 레퍼런스에 기능이 명시 되어 있지만 짧게 설명되어 있어서 지나치기 쉬운 것 같다. 아래는 레퍼런스에 나와 있는 내용이다.

public function lock():void
언어 버전 :     ActionScript 3.0
Player 버전 :     Flash Player 9
이 BitmapData 객체를 변경할 때 BitmapData 객체를 참조하는 어떤 객체(예: Bitmap 객체)도 업데이트되지 않도록 이미지를 잠급니다. 성능을 높이려면 setPixel() 또는 setPixel32() 메서드를 여러 차례 호출하기 전후에 이 메서드를 unlock() 메서드와 함께 사용합니다.

레퍼런스의 내용만으로는 정확히 어떠한 역할을 하는지 알기 쉽지 않다. lock 메소드는 BitmapData의 정보를 화면에 draw하는 처리과정을 일시적으로 사용하지 않도록 하여 불필요한 처리과정을 제거함으로써 퍼포먼스를 향상시킬 수 있다. 예를 들면

보통 BitmapData를 처리하기 위해 addChild(new Bitmap(bitmap))와 같이 addChild한 이후에 setPixel() 또는 setPixel32() 메소드를 사용하는 경우가 많은데, 이때 setPixel() 또는 setPixel32()와 같은 메소드는 그 메소드 자체 처리만으로도 addChild 되어 있는 경우 화면에 draw하는 기능을 함께 처리해 버린다. 따라서 addChild되어 있는 BitmapData에 setPixel() 또는 setPixel32() 메소드를 여러 번 사용하여 복잡한 처리를 할 경우에 setPixel() 또는 setPixel32() 메소드를 호출될 때마다 화면에 draw 하기 때문에 불필요한 CPU 처리를 하게 되는 것이다.

물론 setPixel() 또는 setPixel32()메소드의 처리 과정을 화면에 표시해야 하는 경우라면 별로 효력이 없겠으나 setPixel() 또는 setPixel32() 메소드를 여러 번 처리한 이후 결과만을 화면에 표시할 경우는 lock 메소드를 통해서 화면에 표시하는 기능을 잠그고 일련의 처리를 완료한 이후에 unlock 메소드를 통해서 잠근 기능을 풀어주면 불필요한 처리를 하지 않으면서 화면에 처리한 결과를 표시할 수 있다.

아래 예제를 돌려보면 lock/unlock를 사용하지 않았을 때와 사용했을 때의 차이를 확인 할 수 있다.

lockTest(700, 700);

function lockTest(w:uint, h:uint) {
var bm:BitmapData = new BitmapData(w,h);
addChild(new Bitmap(bm));

trace("lock/Unlock 사용 안함 : "+drawBitmap(bm) + "ms");

bm.lock();
trace("lock/Unlock 사용 : "+drawBitmap(bm) + "ms");
bm.unlock();
}
function drawBitmap(bm:BitmapData):uint {
var start:uint = getTimer();
var w:uint=bm.width;
var h:uint=bm.height;

for (var x:uint=0; x < w; x++) {
for (var y:uint=0; y < h; y++) {
bm.setPixel(x,y,Math.random()*0xFFFFFF);
}
}
return getTimer() - start;
}

// output
lock/Unlock 사용 안함 : 214ms
lock/Unlock 사용 : 157ms

output 결과는 시스템에 따라 다소 차이가 있을 수 있는데 테스트한 컴퓨터 스펙은 아래와 같다.

소니 바이오 노트북 VGN-SZ18LP
Genuine Intel® CPU T2400 @ 1.83GHz
메모리 1.50GB RAM

    

설정

트랙백

댓글

  • Han Sanghun 2007.09.03 23:03 ADDR 수정/삭제 답글

    setPixel 할 때 등, 비트맵을 변경하는 작업을 하려면 lock 해주는게 좋죠...

    • jasu 2007.09.04 06:16 신고 수정/삭제

      네... 기능적인 부분에서 필요성을 느끼지 못하면 지나치기 쉬운 기능들이 여럿 있네요^^

  • lazyartist 2007.09.07 11:01 ADDR 수정/삭제 답글

    님의 블로그 잘 보고 있습니다.~ ^^
    한가지 궁금한게 있는데요~
    소스코드 올릴때 생상은 어떻게 변환 해서 넣는지요?
    저도 아는 사이트가 있기는한데 변환이 잘 안되서요... ^^;
    저는 여기를 이용합니다... http://qbnz.com/highlighter/

    • jasu 2007.09.07 14:54 신고 수정/삭제

      안녕하세요...감사합니다.
      저는 blog.pluszone.net에서 제공하고 있는 beautifierPlus 를 사용하고 있습니다. 간단하고 편해서 사용중이죠 제 블로그 위에 보시면 beautifierPlus 링크를 걸어두었습니다.