티스토리 툴바


'ActionScript 3.0'에 해당되는 글 86건

  1. 2012/04/27 [AS3] 원형으로 BitmapData 복사하기
  2. 2011/07/21 [AS3] int 대신 Number를 쓴다면 얼마까지 안전할까? (26)
  3. 2011/05/19 [플러그인] 브라우져에서 JSON 편하게 보자 (3)
  4. 2011/05/12 Eureka~ 비트맵 속도 높이기 팁~ (5)
  5. 2011/04/21 [AS3] Class의 정보를 샅샅히 뒤져보자 (8)
  6. 2011/04/18 Behind of Flash - 플래시의 숨겨져있는 사실들 (29)
  7. 2011/03/31 Flash Builder 실행시킬 때 원하는 Workspace 지정해서 실행시키기 (1)
  8. 2011/02/28 Away3D 4 Molehill 테스트 (4)
  9. 2010/11/18 [AS3] n.toString() vs String( n ) ? (15)
  10. 2010/07/28 [Tip] 자주 쓰는 반복문 (16)
  11. 2010/07/25 [Flex] Flash Builder 4 Compiler Options (2)
  12. 2010/07/23 [AS3] Flash Player 10.1 활용하기 (36)
  13. 2010/07/01 [AS3] Flash Builder에서 Flash Player 10.1 설정하기 (15)
  14. 2010/05/14 [AS3] 드래그앤드랍으로 파일 가져오기 (is not AIR) (18)
  15. 2010/05/12 [Tip] Array 초기화 시키기 (13)
  16. 2010/05/04 Flash Builder에서 TODO, FIXME 사용하기 (6)
  17. 2010/03/25 [JSFL] Class, Base class 명을 일괄적으로 바꿔보자. (5)
  18. 2010/03/22 [AS3] 한글 "을,를" 구분해주는 MessageUtil (18)
  19. 2010/03/16 [JSFL] *.fla 파일내의 이미지를 모두 뽑아보자. (10)
  20. 2010/03/03 [AS3] 인스턴스 자동 선언 옵션은 반드시 Off 합시다~!! (4)
  21. 2010/01/30 [Tip] Flash Builder 사용하는데 유용한 몇가지 팁 (20)
  22. 2010/01/20 [JSFL 연재] 2. 유용한 JSFL 만들기 (6)
  23. 2010/01/07 Adobe Extension 제대로 설치하기
  24. 2010/01/05 [JSFL 연재] 1. JSFL이란 무엇인가? (15)
  25. 2009/12/22 [AS3] HTML 태그 없애주는 정규표현식 (12)
  26. 2009/11/03 Flash CS4에서 이미지 Import 시에 에러 나는 현상 (62)
  27. 2009/10/22 [AS3] 최대, 최소값 자르기 두가지 방법 (11)
  28. 2009/09/13 [펌강좌] Interface 이해하기 - 장면전환 효과를 인터페이스를 이용해서 만들어보자 (4)
  29. 2009/05/17 Flash API로만 만든 Cover Flow (9)
  30. 2009/04/03 ByteArray를 String으로 변환해서 써보자. (29)

아 백만년만에 블로그 글 쓰는거 같네요~


그러므로 간단하게 ㄱㄱ



BitmapData를 동그랗게 보여주고 싶을 때


마스크는 부담스러울 때 쓸 수 있는 메소드입니다.



이런 고양이 비트맵을



이렇게 나타내줄 수 있습니다.





아래는 코드입니다.


import flash.display.Bitmap;
import flash.display.BitmapData;

var bitmap: BitmapData = new Cat;
var circleBitmap: BitmapData = copyToCircle( bitmap );

addChild( new Bitmap( circleBitmap ) );

function copyToCircle( $target: BitmapData ): BitmapData
{
     var width: int = $target.width;
     var height: int = $target.height;
     const RADIUS: int = width > height ? int( height / 2 ) : int( width / 2 );
     const DIAMETER: int = 2 * RADIUS;
     
     var data: BitmapData = new BitmapData( DIAMETER, DIAMETER );
     
     var circle: Shape = new Shape;
     circle.graphics.beginFill( 0xFF0000, 1 );
     circle.graphics.drawRect( 0, 0, DIAMETER, DIAMETER );
     circle.graphics.drawCircle( RADIUS, RADIUS, RADIUS );
     circle.graphics.endFill();
     
     data.draw( $target );
     data.draw( circle, nullnull, BlendMode.ERASE );
     
     return data;
}

원리는 draw를 해주는 두줄의 코드입니다.


data.draw( $target );


일단 복사를 한번 해주고요


미리 동그라미 모양을 Shape으로 그려놓은 다음에


data.draw( circle, null, null, BlendMode.ERASE );


BlendMode를 ERASE로 그려주면


됩니다.


※ 이때 동그라미 모양이 중요한데


반전된 동그라미 모양입니다.


사각형에서 가운데가 동그라미로 빠진 모습입니다.



이렇게요~


저 빨간 모양을 Shape으로 그려주는게 포인트인데


Shape의 Vector drawing을 이용하면 쉽습니다.


circle.graphics.drawRect( 0, 0, DIAMETER, DIAMETER );

circle.graphics.drawCircle( RADIUS, RADIUS, RADIUS );


그냥 사각형을 그려주고 그다음에 원을 그려주면


겹치는 영역은 자동으로 색이 빠져버립니다.


동그라미 두개를 겹쳐서 그리면 겹치는 부분은 색이 빠지는 것과 같은 원리입니다.




메소드 저장해놓고 ㄱㄱ~




p.s) draw 이기 때문에 sand box type에 유의해야합니다. 

저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요


스타개발자 넓군은 int형이 21억까지 밖에 담을 수 없다는 사실에 짜증나서

Number형을 쓰기로 했다.

100억, 1000억이 되도 프로그램은 잘~돌아갔다.

근데 어느날 에러가 빵빵터져서 값을 살펴보니

서버에서 날라온 값이 1600000000010000253 이었다.

근데 실제로 Number 변수에 담긴 값은 전혀 다르게 1600000000010000100 였던것이다.

Number는 큰 수를 담을 수 있다기에 쓴거였는데 이게 왠일?

여기서 의문이 들었다.

"int 대신 Number를 쓸 경우 어느 정도까지가 안전한걸까?"


Number는 64비트 부동 소숫점 방식을 사용한다.

총 8바이트 = 64비트를 사용한다.

즉, 64개의 on/off로 표현된다는 얘기다.

첫번째 비트 하나는 음수인지 양수인지를 판단하는데 사용되고 (아래에서 s 라고 사용한다) [각주:1]

그 다음 11비트를 지수로 사용된다. (아래에서 n 이라고 사용한다) [각주:2]

그 다음 남는 52비트를 소수로 사용한다. (아래에서 k 라고 사용한다) [각주:3]

k는 소숫점을 나타내는데 1 + ( 1 / k ) 로 쓰인다.

k가 2 라면 1 + ( 1 / 2 ) = 1.5 라는 뜻이다.

편의상 아래에서는 1.k 라고 표현하겠다.

즉 Number 숫자 하나는 다음과 같이 표현된다.

s * ( 2^n ) * 1.k 로 표현된다.



보기 쉽게

( 2^n ) * 1.k

라고 하겠다.



10진수 2를 표현해보면

( 2^1 ) * 1.0 = 2 * 1 = 2

n = 1, k = 0 이다.

9를 표현해보자.

= 8 + 1
= 8 * 1.125
= ( 2^3 ) * 1.125
= ( 2^3 ) * ( 1 + ( 0.125 ) )
= ( 2^3 ) * ( 1 + ( 1 / 8 ) )
= 9

9 하나 표현하는데 이렇게 복잡하다.



그렇다면 Number가 무지 큰 수까지 표현할 수 있다는건 알겠는데

int 보다 더 큰 값을 사용하기 위해서 Number를 쓸 때

과연 얼마나 큰 값까지 정확하게 표현될 수 있을지 알아보자.

1씩 더해가면서 구해보면 되지 않아?




자 그렇다면 유추를 해보자

a라는 값을 만들려면 (어떤수 * 1.얼마)로 표현되어야한다.

여기서 핵심은 "1.얼마"에 있다.

즉, k 에 답이 있다.



여기서 k의 비밀을 파헤쳐보겠다.

Number로 표현하는 정수는 다음과 같은 기준이 되는 수가 있다.

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
...
2^n = N

여기서 16을 한번 골라서 예를 들어보자.

16을 표현해보면

16 = 2^4 * 1.0

n = 4, k = 0 이다.

이 16을 기준으로 17, 18, 19를 표현하려면

각각 1, 2, 3씩을 16에 더해주면 된다.

다른말로 하면 즉 1/16, 2/16, 3/16 을 1에 더해서 곱해주면 된다.

17 = 16 * ( 1*( 1/16 ) )
18 = 16 * ( 1*( 2/16 ) )
19 = 16 * ( 1*( 3/16 ) )

이걸 n, k 방식으로 바꿔보면 이렇다.

17 = 2^4 * 1.(1/16)
18 = 2^4 * 1.(2/16)
19 = 2^4 * 1.(3/16)
20 = 2^4 * 1.(4/16)
21 = 2^4 * 1.(5/16)
22 = 2^4 * 1.(6/16)
23 = 2^4 * 1.(7/16)
24 = 2^4 * 1.(8/16)
25 = 2^4 * 1.(9/16)
26 = 2^4 * 1.(10/16)
27 = 2^4 * 1.(11/16)
28 = 2^4 * 1.(12/16)
29 = 2^4 * 1.(13/16)
30 = 2^4 * 1.(14/16)
31 = 2^4 * 1.(15/16)
32 = 2^5 * 1.(0/32)
33 = 2^5 * 1.(1/32)

64(2^6)를 기준으로 65, 66을 표현하면

65 = 2^6 * 1.(1/64)
66 = 2^6 * 1.(2/64)
...
127 = 2^6 * 1.(63/64)

이런식으로 나간다.

자세히보면 1/64 여기에 바로 답이 있다.





자 이제 머리를 환기 시키고 새로운 주제로 넘어간다.

위에서 수를 증가시켜주기 위해서 1/16, 2/16, 3/16 표현이 되는데

다음과 같이 풀어볼수 있다.

1/16 = 1/16

2/16 = 1/8

3/16 = 1/16 + 2/16
       = 1/16 + 1/8

4/16 = 1/4

5/16 = 1/16 + 4/16
       = 1/16 + 1/4

6/16 = 2/16 + 4/16
       = 1/8 + 1/4

7/16 = 1/16 + 2/16 + 4/16
       = 1/16 + 1/8 + 1/4

...

15/16 = 1/16 + 2/16 + 4/16 + 8/16
         = 1/16 + 1/8 + 1/4 + 1/2

뭔가 리듬이 느껴지는가?

모두 1/x 의 조합으로만 표현이 가능하다.

16은 2^4, 8은 2^3, 4는 2^2, 2는 2^1 이다.

여기에 쓰인 4, 3, 2, 1이 바로 k 다.

k를 위한 비트수가 52비트라는 얘기는

1/2^52 + 1/2^51 + 1/2^50 ......... 1/2^1

까지 표현할 수 있다는 뜻이다.

이 숫자들의 배열도 매우 흥미로운 내용으로 채울 수 있지만 오늘의 포스트 주제에 너무 멀어지므로 결론으로 빨리 가보자.

그렇다면 이렇게 1/k의 조합으로 얼마나 작은수까지 나눌 수 있을까?

1/k 의 조합으로 더 이상 1단위로 나눌 수 없을만큼 큰 수가 바로 우리가 찾는 그 수가 아닐까?



1/2^52 + 1/2^51 + 1/2^50 ......... 1/2^1

바로 이 수가 바로 정수로 1씩 증가했을 때 차곡차곡 나타낼 수 있는 최대라는 뜻이다.

k가 4 일때 나타낼 수 있던 마지막 숫자가

31 = 16 + 15
    = 16 + 1*(15/16)
               = 15/16 = 1/16 + 2/16 + 4/16 + 8/16
                           = 1/16 + 1/8 + 1/4 + 1/2

위와 같았다.

k=4로는 128, 즉 2^5는 나타낼 수 없었다.

k가 4라면 나타낼 수 있는 제일 큰 수는 ( 2^5 ) - 1 이다.

그렇다면 k를 52까지 나타낼 수 있을때 제일 큰 수는 2^53 - 1이 될것이다.

즉 2^53보다 값이 크다면 정확하게 계산하지 못한다는 뜻이다.



2^53은 9,007,199,254,740,992 이다.

테스트를 한번 해보자.

trace( 9007199254740990 );
trace( 9007199254740991 );
trace( 9007199254740992 );
trace( 9007199254740993 );
trace( 9007199254740994 );

이 구문을 플래시에서 실행해보자.

그냥 긁어붙여도 된다.

9007199254740990
9007199254740991
9007199254740992
9007199254740992
9007199254740994

위와 같이 찍혔을 것이다.

Number 형이 9007199254740992가 넘어가면서 k가 52로는 1씩 계산할 수 없으므로 끝자리가 3을 표현하지 못해 4로 건너뛰어버린것이다.

즉 9007199254740992 까지가 1씩 증가시켰을 때 손실이 없는 보장된 범위라는 뜻이다.

한글로는 9경이다.

생각보다 크지 않다. 막 셀 수 없는 어마어마한수가 아니라 9000억 * 10 이 끝이다.

이 이상을 1씩 카운팅한다면

그 프로그램은 당장 오류가 발생할 것이다.





우리가 플래시를 다루면서 만약 9경을 넘는 수를 정확하게 카운팅해야된다면

Number 역시 답이 아니라는 뜻이다.

Number도 9경이 넘어가면서 1자리에서 손실이 발생하기 시작한다.

자릿수로는 16자리지만 16자리를 풀로 사용할 수 있는게 아니기 때문에

자릿수로는 고작 15자리까지만 보장이 된다는 뜻이다.



숫자가 15자리가 넘어가는 상황이 있다면 반드시 문자열로 다루고

대수연산에 쓰이는 수학라이브러리를 찾아 활용해야한다.





For the better.






  1. 1과 -1을 나타내는 sign이라고 해서 s 라고 사용한다. [본문으로]
  2. Exponent, 지수라고 한다. 2^n으로 사용하기 때문에 n이라고 한다. n 이 표현하는 범위는 1024에서 -1023 까지 표현되기 때문에 실제로 읽어오는 n 값에 1023을 빼줘야 실제 값이 된다. 읽어온 값이 1024라면 실제 n 값은 1이 된다. [본문으로]
  3. 원래는 m으로 사용한다. Mantissa, log 함수에서 소숫점을 나타내는 가수를 뜻한다. 하지만 n과 m으로 쓰면 헷갈려서 그냥 k 라고 한다. [본문으로]
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 소연

    아따~ 어렵네~ㅋ 좀이따 다시읽어봐야게써.ㅋ

    2011/07/21 22:15 [ ADDR : EDIT/ DEL : REPLY ]
  2. neec

    Number에 대해 다시 한 번 생각해 보게 되는 계기가 됐던거 같습니다. 정수가 필요한 상황에서 괜한 오버헤드를 감수하는 실수형은 자칫 의도하지 않은 버그로의 지름길이 되지 않을까 생각됩니다.

    실제 64bit 정수형을 다루게 되는 상황은 꽤나 빈번하고 절실할 때가 많습니다.(GUID 등)
    공교롭게 as3에서는 사용자가 연산자를 재정의 하는 일은 불가능해 통상 int 두 개를 이용해 int64 클래스를 사용하게 돼죠. 실제 이 클래스가 지원해야 할 메서드는 add, mul, div, equal, toString, fromString이면 충분합니다.
    이 값은 런타임에 int 두 개로 존재하며 보관은 String인 형태가 되겠죠.

    2011/07/21 23:31 [ ADDR : EDIT/ DEL : REPLY ]
    • operator 만 override가 된다면 많은걸 할 수 있을텐데 그게 참 아쉬워요 ㅎㅎ

      2011/07/22 00:24 [ ADDR : EDIT/ DEL ]
  3. 개발자들은 왜 이러고 노는걸까.

    2011/07/22 00:08 [ ADDR : EDIT/ DEL : REPLY ]
    • 헐 노는거 아니거덩~
      실제로 소셜 게임 만들다보면 큰수를 얼마나 자주 만나는데...;;;

      어디까지 표현할 수 있는지 알고 만드는거랑 모르고 만드는거랑 천지차이지

      2011/07/22 00:25 [ ADDR : EDIT/ DEL ]
    • 아아.. 노느게 아니였다니..ㅡㅜ
      그럼 더 싫어진다..ㅋㅋ

      2011/07/22 11:17 [ ADDR : EDIT/ DEL ]
  4. 부동소수점. 항상 골칫거리에요 ㅎㅎ
    자릿수도 중요하지만, 늘 같이 생각해야 하는 것이 floating하는 소수점이라는 사실 ㅎㅎ

    2011/07/22 01:20 [ ADDR : EDIT/ DEL : REPLY ]
    • 그저 큰수, 큰수... 라고만 알았지 막상 해보니까
      생각보다 큰수가 아니어서 약간 실망했습니다.
      그나저나 BigInt 나 int64 같은 클래스는 제대로 된게 별로 없네요 ㅠㅠ

      2011/07/25 11:48 [ ADDR : EDIT/ DEL ]
  5. 고철덩어리 같으니라고 !

    2011/07/22 07:51 [ ADDR : EDIT/ DEL : REPLY ]
  6. 하늘아이

    괜찮은 팁이군요.
    그래도 변화를 최소화 하기 위해서 맨 마직막에 1/2를 무시해 주는 센스를 발휘해서.... 그 이상 값들은 짝수로만 찍히는군요..

    2011/07/22 10:27 [ ADDR : EDIT/ DEL : REPLY ]
    • 꼭 1/2 이라고 생각하긴 어려울거 같아요.
      그냥 전 9경까지만 안전하다~ 라고만 생각하려구요 ㅎㅎ

      2011/07/25 11:49 [ ADDR : EDIT/ DEL ]
  7. 이렇게 멋진 글을~ overflow에 대한 대비는 항상 필수~ ^^

    2011/07/22 11:09 [ ADDR : EDIT/ DEL : REPLY ]
  8. 와우 멋져요! 감동받았습니다! 항상 궁금해하던건데!!

    2011/07/22 16:21 [ ADDR : EDIT/ DEL : REPLY ]
    • 값으로 검색해보니 너무 많은 게시물이 나오더군요 ㅠㅠ

      2011/07/24 22:54 [ ADDR : EDIT/ DEL ]
  9. synchrong

    M이론에 나온 10+1 차원에 빠진 야꼬군... 우리가 사는세계는 3차원이라고... 그만 돌아왕

    2011/07/24 01:52 [ ADDR : EDIT/ DEL : REPLY ]
    • 요즘은 다섯개 이론에 14차원까지 나왔다던데? ㅋㅋㅋㅋ
      난 초끈이론은 철학이라고 봐 ㅋ

      2011/07/24 22:53 [ ADDR : EDIT/ DEL ]
  10. 응아

    고대 수학자.. 같습니다. ;;;;
    좋은 정보 재밌게 잘 읽고 갑니다!*^

    2011/07/24 10:51 [ ADDR : EDIT/ DEL : REPLY ]
    • 큰수 다룰때 늘 불안하던걸 함 자세잡고 풀어본건
      값을 알고나서 검색해보니 이미 너무너무 많이 알려진 사실이라
      머쓱합니다 ㅋㅋ

      2011/07/24 22:52 [ ADDR : EDIT/ DEL ]
  11. 우르

    우야꼬의 플래시 cs4 샀다 왕 쓸모 많음
    감사???합니다.

    2011/08/13 22:43 [ ADDR : EDIT/ DEL : REPLY ]
  12. 우르

    우야꼬의 플래시 cs4 샀다 왕 쓸모 많음
    감사???합니다.

    2011/08/13 22:43 [ ADDR : EDIT/ DEL : REPLY ]
  13. 나도야

    2011/09/07 20:14 [ ADDR : EDIT/ DEL : REPLY ]
  14. 컴백홍

    항상 궁금하던 건데, 속 시원히 풀어줘서 정말 감사합니다.

    2011/10/18 14:09 [ ADDR : EDIT/ DEL : REPLY ]
  15. 멋진 글이네요 링크 추가해갈께요 ^^

    2012/02/22 18:31 [ ADDR : EDIT/ DEL : REPLY ]

JSON으로 통신할 때 테스트하려고 브라우져에서 보면

죄다 텍스트로 나와서 짱났었는데

브라우저 플러그인을 쓰니 완전 편하네요 ㅋ

FireFox : [ JSON View 바로 설치 ]



Chrome : [ JSON Formatter ]




p.s) IE는 취급 안함다 ㅋ



For the Better.
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 바로 뷰는 안되지만 가끔 안될때 웹페이지로

    http://json.parser.online.fr/
    http://jsonviewer.stack.hu/

    괜찮더라구요 +ㅁ+b

    2011/05/20 09:14 [ ADDR : EDIT/ DEL : REPLY ]
  2. 두번째꺼는 Text 탭에 Remove white space, Format 이 쏠쏠해서 괜찮더라구요
    11.0.1.3 에도 JSON 파서 들어가고 대세이긴 대세인가봐요

    2011/05/21 10:33 [ ADDR : EDIT/ DEL : REPLY ]

아셔씀까?

fla에 있는 이미지 파일들을 linkage 만 걸어줘도 빨라진다는 사실을 ?!

특히나 반복이미지로 애니메이션주는 무비클립일 경우 음청 빨라집니다.

거의 3배이상?

자 ㄱㄱ


↓↓↓ 효과 보신 분들 댓글 달아주셈~ ↓↓↓
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 흠... 해보진 않았지만, 희한한걸 발견했군 ㅎㅎ
    메모리에 상주가 되어서 빨리 처리가 가능해 진건가?
    그래서 클라이언트들이 상주를 원하는 거군 ㅋㅋㅋㅋㅋ

    2011/05/12 23:50 [ ADDR : EDIT/ DEL : REPLY ]
    • 긍가바여 근데 좀 이상해요 -_-
      linkage 걸었더니 애니메이션이 껌뻑껌뻑대네요 -_-a

      2011/05/13 11:54 [ ADDR : EDIT/ DEL ]
  2. d3light

    사수가 이미 그렇게 사용하고 있어서 몰랐었는데 좋은 거였었군요 ㅋ

    2011/05/13 10:10 [ ADDR : EDIT/ DEL : REPLY ]
  3. 믹네코이

    근대....
    cs3에서 작업한걸 cs4나 cs5에서 링크 걸면 깜빡거리던데....

    2011/05/23 14:37 [ ADDR : EDIT/ DEL : REPLY ]

아마 Flash를 오래 하신분들은 한번쯤 들어봤지만 지금은 다들 잊고 계실만한 메소드가 있습니다.

바로 flash.utils.describeType 이라는 클래스인데요.

객체를 넘겨주면 그 객체의 정보를 자세하게 파악해서 XML로 돌려주는 메소드입니다.

"어따 쓸까"하고 묻어뒀던 메소드인데

오늘 의외의 쓰임새를 알아냈습니다.



먼저 몸을 먼저 풀어보죠.

var mcClass: Class = Object( mc ).constructor;

trace( mcClass ); // [class MovieClip]

var mc2: MovieClip = new mcClass();

trace( mc2 ); // [object MovieClip]

이라는 코드가 있습니다.

mc라는 instance에서 flash.display.MovieCilp 이라는 Class를 가져오는 방법은 뭘까요?

var mcClass: Class = Object( mc ).constructor;

trace( mcClass ); // [class MovieClip]

var mc2: MovieClip = new mcClass();

trace( mc2 ); // [object MovieClip]

위와 같이 할 수 있겠죠.

이 방법이 instance로부터 class를 가져오는 방법입니다.



하지만 이것도 가능할까요?

먼저 A라는 class가 있습니다.

package
{
     import flash.display.MovieClip;

     public class A
     {
          public var mc: MovieClip = null;

          public function A()
          {

          }
     }
}

이 A라는 class에는 mc 라는 property가 있습니다.

만약 A.mc 가 객체로 들어있는 상태라면 문제가 없겠지만

아직 선언을 하지 않은 상태라면 mc는 현재 값이 null이라서

constructor를 가져올 수 없는 상태입니다.

이때는 어떻게 해야할까요?

이때 쓸 수 있는게 바로 describeType() 메소드입니다.

파라미터로 넘겨진 class나 instance의 구조를 샅샅히 뒤져줍니다.



테스트를 한번 해볼까요?

위에서 만든 A라는 class를 한번 돌려보겠습니다.

trace( describeType( A ).toXMLString() );


직접 해보실분들은 describeType( MovieClip ) 해주셔도 됩니다.

결과는 다음과 같죠.

<type name="A" base="Class" isDynamic="true" isFinal="true" isStatic="true">
  <extendsClass type="Class"/>
  <extendsClass type="Object"/>
  <accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
  <factory type="A">
    <extendsClass type="Object"/>
    <variable name="mc" type="flash.display::MovieClip"/>
  </factory>
</type>

장난 아니죠.

클래스를 샅샅히 살펴줍니다.

여기에 보면 <factory> 노드가 바로 class의 내용입니다.

여기에 보면 <variable> 이라는 노드가 보이죠.

여기에 @type을 보면 이쁘게 적혀있습니다.

이것을 응용하면 됩니다.



하지만 중요한게 property는 <variable> 노드로 나오지만

getter의 경우는 <accessor> 노드로 나옵니다.

여기서 끝이 아닙니다.

class의 경우는 <factory> 노드로 되어 있지만

instance의 경우에는 그렇지 않습니다.



간단하게 A 라는 class를 넘긴다고 가정하고 예제를 만들어보자면

다음과 같습니다.

trace( describeType( A ).factory.variable.( @name == "mc" ).@type.toString() );

복잡하지요?

풀어보자면 이렇습니다.

trace( describeType( A ).
factory. // factory 노드중에
variable. // variable 노드중에
( @name == "mc" ). // attribute가 "mc"인 녀석의
@type.toString() ); // "type" 이라는 attribute 값을 toString()

입니다.

이 기능을 메소드화 시키려면

class인지 instance인지 구분해야하고

accessor인지 variable인지 구분해야합니다.

이 모든걸 적용해서 메소드를 만들면 다음과 같습니다.

package
{
     import flash.utils.describeType;
     import flash.system.ApplicationDomain;

     public function getClassOfProperty( $instance: *, $propertyName: String ): Class
     {
          var describedXML: XML = describeType( $instance );

          if( $instance is Class )
               describedXML = describeType( $instance ).factory[ 0 ];

          var propertyClassName: String = describedXML.variable.( @name == $propertyName ).@type.toString().replace( "::", "." );

          if( propertyClassName == null )
               propertyClassName = describeType( $instance ).accessor.( @name == $propertyName ).@type.toString().replace( "::", "." );

          var propertyClass: Class = Class( ApplicationDomain.currentDomain.getDefinition( propertyClassName ) );

          return propertyClass;
     }
}


좀 복잡하지만 결과는 깔끔하게 class로 뽑아줍니다.



예제와 소스 첨부합니다.

getClassOfProperty 유틸 [ 다운 받기 ]





For the Better.
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 투더리

    ㅋㅋㅋㅋ 멋져멋져~!

    2011/04/21 19:05 [ ADDR : EDIT/ DEL : REPLY ]
  2. 이걸 이용해서 리플렉션을 통해 클래스를 얻을 수도 있고 여러모로 좋더라구요
    전 엠베딩 한 자원 자동적으로 인스턴스화 해서 저장해 놓을 때 쓴적이

    2011/04/21 19:27 [ ADDR : EDIT/ DEL : REPLY ]
  3. 하지만 describeType에 큰 문제가 있는데 바로 release버전으로 컴파일 했을때 제대로 동작을 안한다는 점이야.
    http://diebuster.com/flash/152 을 확인해봥~ ^^;;

    2011/04/21 20:31 [ ADDR : EDIT/ DEL : REPLY ]
    • 헐 진짜요? 음... 큰일이네... 프로젝트에서 쓰려고 그런건데....

      2011/04/21 21:05 [ ADDR : EDIT/ DEL ]
    • 휴... 다행히 class 내용은 안없어지네요... 쓸 수 있을 듯 ㅎㅎㅎㅎ
      형님 완전 고마워요 ㅋ

      2011/04/21 21:22 [ ADDR : EDIT/ DEL ]
  4. 오! 이런방법이~^^

    2011/04/21 21:03 [ ADDR : EDIT/ DEL : REPLY ]
  5. 칸치

    describeType 으로 annotation customizing 하면 좋더라구여

    2011/04/21 22:02 [ ADDR : EDIT/ DEL : REPLY ]
  6. 근데..일단 엄청 느려.
    남발하지말고 초반에 초기화시에나 함 사용하라는..

    2011/04/21 23:49 [ ADDR : EDIT/ DEL : REPLY ]

플래시로 개발하기 시작하면서 이태까지 경험하면서

실제로 책이나 블로그에서는 잘 가르쳐주지 않는 사실들을 가끔 깨달을 때가 있다.

그중에서도 내가 가장 크게 깨달았고

플래시 프로그래밍을 공부하는 분들께 도움이 되었으면 하는 바람에서

몇 가지 숨겨져있는 사실들을 이야기해보겠다.



1. 클래스는 대부분 재사용되지 않는다.

OOP가 플래시에서도 뜨거운 감자로써

기본 소양처럼 널리 공부되고 있다.

OOP의 원칙은 두 가지.

바로 재사용성과 확장성.

하지만 실제로 플래시 개발이 고도화되고 복잡해질수록

클래스가 재사용되는 일은 매우 드물다.

오히려 프레임웍으로 만들어 프레임웍 자체가 재사용되면 되었을까

프로젝트에서 만들어진 클래스의 대부분(특히 UI관련)을 재사용되지 않는다.

클래스를 만들때는 각종 OOP기법과 디자인 패턴을 적용하여

최대한 재사용되고 확장될 수 있도록 만들려고 애를 쓴다.

하지만 정작 새로운 프로젝트와 새로운 모듈을 만들때는

그 프로젝트만의 특성이 있기 때문에 결국 새로운 클래스를 만들게 된다.

재사용되는 클래스는 완전 프로젝트와 분리될 수 있는 각종로더나 문자열 관련 유틸, 숫자 연산같은

유틸성이 대부분이다.

프로젝트를 진행하면서 앞으로도 재사용될 수 있는 클래스를 바로 바로 만든다는 것은

경력 8, 9년차정도 되어야 가능한 일이라고 본다.

프로젝트를 진행하면서 클래스를 재사용하려고 너무 시간을 허비하는 것 보다

일단 어떻게든 돌아가게 개발하고 그것을 리팩토링하는게 5배이상 프로그래밍 실력 향상에 도움이 되리라 믿는다.

Do First, then Fix After.

먼저 어떻게든 돌아가는 프로그램을 짜고

마음에 안들거나 바꿔야하는 부분이 생기면 그때 바꾸는게 훨씬 효율적이며

결과적으로도 더 깔끔한 컴퍼넌트가 나오는 걸 경험할 수 있다.



2. 디자인 패턴은 약보다 독이 될 경우가 훨씬 더 많다.

미친 소리로 들릴 수도 있겠지만

디자인 패턴은 실제로 경력 4, 5년차 미만의 플래시 개발자의 경우

득보다 독이 되는 경우가 훨씬 많다.

디자인 패턴은 어떤 패턴 한 두개가 핵심이 되는게 아니라

아키텍쳐의 한 부분을 가지를 쳐내다보면 디자인 패턴으로 보이는것이지

디자인 패턴이 모여서 아키텍쳐가 되는게 절대 아니다.

디자인 패턴이라는 개념 자체가

굉장히 많은 프로그래밍 경험을 토대로

이런 이런 상황에서는 이런 이런 식으로 해서 쓰니까 좋"더라"라는

경험의 축적으로부터 나온 것이기 때문에

그 경험이 충분치 않은 개발자들에게 디자인 패턴은

초등학생에게 철학을 가르치는 것과 마찬가지다.

디자인 패턴을 공부하고나서 중독증상으로

자기 앞의 모든 코드를 모두 패턴이라는 이름하에서 코딩하려고 하는 디자인 패턴 초입자들은

대부분 자기가 원래 개발할 수 있는 시간보다

세배 네배, 심지어는 아예 개발을 못하고 멈춰버리는 수가 많다.

프로그래밍은 코드 자체가 의미있는게 아니다.

프로그래밍은 만들고자하는 것을 쉽게 만들어주는 도구이지

코드를 얼마나 이쁘게 짜는지가 프로그래밍이 아니라는 뜻이다.

까짓거 한글 변수면 어떻고, 4중 for문이면 뭐 어떻나...

for 문 좀 많이 썼다고 프로젝트가 망하는거 아니다.

디자인 패턴은 무의식중에 코드를 무지막지하게 써내려가다가

손끝에서 알아서 나올때 그게 유용한 디자인 패턴인 것이다.

이 모든 사설을 다 빼고 이렇게 한 문장으로 말할 수 있을것이다.

"디자인 패턴은 공부하지 않아도 경력이 쌓이면 알아서 익혀지게되는 것들이다."



3. Flash는 느리지 않다.

HTML5가 이끈 퍼포먼스에 대한 Flash 이슈들에 대해서 많이들 들어봤을 것이다.

"Flash is sucks"라는 말까지 듣는 상황이다.

플래시가 느리다는 대부분의 이유는 바로

대부분의 플래시는 Display 관련 처리가 많고

거기다가 엉망으로 짠 플래시들은 대부분 이미지를 대량으로 최적화 없이 싣고 있기 때문이다.

사실 enterFrame이나 single-thread 여서 느린것도 있다.

하지만 "대부분"의 경우에는 이미지를 무지막지하게 쓰거나 벡터나 동영상들을

최적화 없이 마구 돌리기 때문이다.

실제로 Flash는 virtual machine 위에서 돌아가기 때문에

기본 연산이나 반복문, 바이너리 처리는 굉장히 빠른편이다.

물론 C나 Java에 비할바는 아니겠지만

적어도 Flash is Sucks라는 말을 들을 정도까진 아니다.

HTML이나 Javascript는 아예 비교할 가치도 없을 뿐더러 ShockWave나 Unity(3D기능 빼고 ㅋ)에 비해서

결코 뒤지는 퍼포먼스가 아니라는 이야기다.

int 대신 Number를 쓰면 메모리 많이 먹는다고 걱정하거나

클래스가 너무 많아서 고민이라거나

이미 로드된 swf를 사용하지 않으면 어떻게 unload 해야할지 발을 동동구르거나

하는 걱정들은 솔직히 프로젝트에 아무 영향 없을 때가 훨씬 많다. (사실 대부분이다.)

for 문이나 메모리 때문에 플래시 개발이 막히는 경우는 거의 없다.

게임이나 모바일, 미디어 관련 프로젝트에는 중요하겠지만

게임도 대부분의 미니게임에서는 메모리나 for 문 한두개, 클래스 1, 200개 정도로 문제가 되진 않는다.

Flash는 여러분의 생각보다 충분히 빠르며

이 역시도 마찬가지로 일단

Do First, then Fix After, 일단 만들어보고 문제가 된다면 그때 고쳐도 충분하다.



4. Frame Script는 의외로 좋다.

ActionScript 3.0이 나오고 나서

Frame Script가 죄악시되는데

Frame Script는 fla안에 코드가 있어서

UI와 개발이 분리되는 개발환경일 때 코드가 일원화 되어 있지 않다는 문제가 있을 뿐이지

Frame Script가 느리거나 절대 쓰면 안되는 그런 죄악은 아니다.

프로그래밍이라는 의미자체가

반복작업을 줄여주고 인간의 사고를 최대한 효율적으로 기계어로 풀어내는 것일진데

UI에 붙어있는 짧은 코드 한줄은

클래스 수십개를 능가하는 효율을 발휘할 때가 있다.

가령 예를 들자면

마지막 프레임에 넣어놓은 stop() 구문을 굳이 따로 개발한다면

어떻게 개발할건가?

솔직히 난 Frame Script를 쓰지 않고는 잘 방법이 떠오르지 않는다.

this.addFrameScript( stop, this.totalFrames - 1 ); 이거 말고는 생각이 나지 않는다.

적절히, 다른 클래스들에게 영향을 끼치지 않는 한에서는

Frame Script는 개발 편의성 측면에서 한 점의 화룡정점이 될 수 있다는 것을 잊지 않았으면 한다.



5. Event 구조는 매우 안좋은 기능이다.

특히 Display List에서 Dispatch - Listen 구조는

정말 최악중에 최악이다.

Event의 장점은 단 하나다.

SRP - Single Responsibility Principle

바로 클래스를 캡슐화하는데 있어서 내부의 상황을 바깥으로 알리는데 드러내지 않고 구현할 수 있기 때문이다.

하지만 Display List에서의 이벤트는 너무 느리다.

특히 child 구조가 복잡해질수록 event의 전달과정은 느리기 짝이 없다.

그중에서도 가장 나쁜 이벤트 방식은

내부에서 이벤트를 받아다가 다른 이벤트를 새로 작성해서 바깥으로 보내는 경우다.

btn.addEventListener( "click", clickListener );

function clickListener( $e: MouseEvent ): void
{
    this.dispatchEvent( new Event( "merong" ) );
}

Display List에서 마우스 이벤트는 전달되는 과정이 생각보다 매우 복잡해서

메모리 뿐만 아니라 속도도 매우 느리다.

이는 작은 프로젝트에선 모르다가 이벤트를 맹신하고 마음놓고 쓰기 시작하면서부터 경험할 수 있는데

이를 경험하고 나서 부터는 반드시 필요한 때가 아니면

주로 callback 방식으로 바꿔서 쓰고 있다.

Event는 클래스를 캡슐화하는데 있어서 탁월한 기능이 있지만

Display List 구조에서는 생각보다 굉장히 느리다는 단점이 있다는 것을 반드시 기억해야한다.



블로그에 포스팅하면서 처음쓰는 네거티브한 내용의 글인것 같은데

그만큼 너무 부풀어 있는 거품을 좀 걷어내어야 할 필요성을 느꼈고

실제로 크고 작은 개발을 해보면서 느낀 바를 옮겨적어보았다.

옳다 그렇다의 이분법적인 이야기를 하려하기보다는

책이나 포스팅에서 너무 이론적인 접근만 하는

공부보다 실제 개발을 할 때 도움이 되었으면 하는 이야기들이라고 생각했다.

혹시 다른 생각을 가진 분이 계시면 꼭 댓글을 달아주었으면 한다.

:D
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 경험에서 나온 귀한 정보 !

    2011/04/19 07:51 [ ADDR : EDIT/ DEL : REPLY ]
  2. 공감가는 부분이 많네요 :)

    2011/04/19 13:35 [ ADDR : EDIT/ DEL : REPLY ]
  3. gohee

    상콤, 쫄깃함이 몰려오네요.

    2011/04/20 13:35 [ ADDR : EDIT/ DEL : REPLY ]
  4. 뉴 이벤트 메롱에서 감동 :D

    2011/04/20 21:50 [ ADDR : EDIT/ DEL : REPLY ]
  5. alex

    좋은글 감사합니다. 실무에서 느꼈던 것들인데 이렇게 글로 잘 정리되다니 놀랐어요~~

    2011/04/21 11:54 [ ADDR : EDIT/ DEL : REPLY ]
  6. 특히 2번-디자인패턴과 4번-프레임스크립트가 공감이 갑니다. 헤드 퍼스트 디자인 패턴을 보고 처음에 느낀 게 '이걸 굳이 배워야 하는 건가? 코딩하다 보면 걍 이렇게 만들게 되지 않나?' 였거든요. 프레임스크립트를 안 쓰면 enterFrame 수신자에서 프레임 레이블을 체크하는 식으로 코딩하게 되어 쓸데 없이 복잡해지곤 했습니다.

    2011/04/21 12:09 [ ADDR : EDIT/ DEL : REPLY ]
    • 스스로 느끼다니 대단하네요.
      유난히 플래시쪽에는 패턴 중독이 많이 보이는거 같아서 안타까워요.

      2011/04/25 23:23 [ ADDR : EDIT/ DEL ]
    • 갠적으로 "이걸 설계할 때는 이런 디자인 패턴을 써볼까?" 가 아니라 "이걸 편하고 쉽게 쓰려면 이렇게 설계하고.. 여기서 이런 패턴과 저런 패턴이 보이는 군" 이라고 생각하는 게 옳다고 생각합니다.

      2011/04/26 00:44 [ ADDR : EDIT/ DEL ]
  7. 찰카닥

    오우!! 좋은내용 1 , 2 번 다 나에게 와닿는다는 일단 클라이언트와의 시간도 중요한듯 결과물을 보여줘야되니 오히려 패턴 oop생각에 빠지다가 사용하지않는 클래스만 많아져서 다시 단순하게 가게 됬다는 ㅜㅜ 공부합시다!!

    2011/04/21 14:43 [ ADDR : EDIT/ DEL : REPLY ]
    • 공부하자!! 할게 너무 많아 ㅠㅠ
      시간이 없어서 하나둘씩 놓아버려야될게 많아지고 있어 ㅠ.ㅠ

      2011/04/25 23:24 [ ADDR : EDIT/ DEL ]
  8. 마카오슈

    2번내용에 좋아요 1표~

    2011/04/21 23:46 [ ADDR : EDIT/ DEL : REPLY ]
  9. 항상 케바케가 존재하는 듯.
    만들고 나서 고치라는 건 대공감.

    2011/04/23 10:02 [ ADDR : EDIT/ DEL : REPLY ]
    • 응~ 만들기전에 완벽하게 구상해서 쨔잔~하고 만들면 좋겠지만
      대부분은 일단 만들고 나서 고치는게 현실적이더라 ㅎㅎ

      2011/04/25 23:25 [ ADDR : EDIT/ DEL ]
  10. 야훔

    생각할 수록 공감이 많이 가는 글이네요 ㅎ
    디자인패턴은 많은 경험으로 인해 몸에 새겨지지 않으면 효과적으로 쓰기 어렵죠

    2011/04/25 21:20 [ ADDR : EDIT/ DEL : REPLY ]
  11. mistmini

    ㅎㅎ 그린취업반에서 타고 왔어요...ㅋㅋ
    좋은 글 보고가네요 ㅋㅋ
    전 1,4번에 한표 ㅋㅋㅋ..

    정말 직접 실무하시면서 느끼신 거라 ㅎㅎ 참 현실적이고 좋네요 ㅋㅋ 공감공감~ㅎ

    2011/05/02 14:49 [ ADDR : EDIT/ DEL : REPLY ]
  12. OneLove

    늘 쓰는 패턴은 어딜 가나 쓰는 경향이 있지 않나요?
    여기서 말하는 패턴이 Gof 패턴만 말하는건 아닙니다.
    객체들의 생성, 관리, 상태 등은 프로젝트가 변화해도 늘 해줘야 하는 것 아닌가요 ㅡ_ㅡ;;

    2011/05/09 12:04 [ ADDR : EDIT/ DEL : REPLY ]
    • 늘 쓰던 패턴이면 자주 써야죠.
      하지만 패턴 초입자가 패턴을 쓰기위해 주객이 전도되는 경우를 경계해야한다는 생각입니다.
      그리고 특정한 패턴도 때와 상황에 따라서 쓰지 않고 흔히 말하는 막코딩으로 먼저 짜고
      나중에 시간이 될 때 리팩토링으로 패턴화시키는 것도 꼭 고려했음 좋겠다는게 제 생각입니다^^

      2011/05/09 14:47 [ ADDR : EDIT/ DEL ]
    • OneLove

      리팩토링 하실때 간단한 팁이 있을까요 ^_^
      꼭 리팩토링 한다고 하면 전역변수 지역변수로 손보고
      애매모한 메소드 이름, 클래스 이름등 만 손이 가고
      나머지는 뭘 어떻게 눠야 할지 막막할때가 많습니다.

      2011/05/09 17:08 [ ADDR : EDIT/ DEL ]
    • 저는 리팩토링의 시작은 메소드 쪼개기부터라고 생각합니다.

      SoC(Seperation of Concern) 관심을 분리시켜 하나의 클래스는 하나의 역할만 담당한다는 객체 지향 방법을
      메소드에도 적용하는게 좋다고 생각합니다.
      한 메소드는 하나의 로직을 담당하도록 쪼개다보면
      비슷한 역할끼리 뭉치는 경향이 보이게 됩니다.

      그렇게 되면 클래스를 빼게 되고
      멤버변수와 상관없이 도는 메소스들끼리는 유틸 클래스로 뺀다거나

      클래스들끼리의 관계를 관장을 하는 메소드들끼리는
      매니저 클래스로 뺀다거나

      객체의 생성과 제거를 타이트하게 해야되겠다 싶으면
      팩토리패턴을 하나 새로짜서 바꿔치기하고...

      저는 이런 절차의 가장 첫 걸음을 메소드 분리에서부터 시작합니다.
      혹시 도움이 되셨으면 좋겠네요^^

      2011/05/09 22:07 [ ADDR : EDIT/ DEL ]
    • 난최장군

      리팩토링 할때 가장 중요한건 단위를 구분하는 거라고 생각합니다.

      코드를 돌때 가장 마지막에 하는 일 부터 나눠서 하나씩 클래스로 나누고 같거나 비슷한 기능을 묶어서 하나의 클래스로 묶거나 상위 클래스를 만들어서 상속해서 사용하는 방법을 주로 쓰다 보면 어느새 트리형태로 된 클래스 구조가 완성될 것입니다. 이 과정에서 패턴이라고 불리는 과정이 유출되고 그동안 공부했던 유용한 패턴을 실제 사용해보면서 내 코드에 맞는 나만의 패턴이 완성된다고 봅니다. 이 과정이 익숙해 지면 코딩을 시작할때 전체 기능을 보고 그림을 그린 후 패턴이 우선 되고 그 뒤에 코드가 완성되는 과정이 되겠죠.. 위 글에서 8~9년 차에 해당하는 부분이 아닐까 합니다..

      2011/05/11 15:17 [ ADDR : EDIT/ DEL ]
  13. 난최장군

    좋은글 감사합니다^^
    전체적으로 많은 부분에서 공감이 갑니다. 특히 stopㅋㅋ
    저역시 수많은 리팩토링을 하다 보니 자연스레 패턴을 익히고 패턴 책을 보면서
    자연스레 리팩토링에 적용하다 보니 지금은 코드짜기 전에 그림만 수십장 그려 봅니다 ㅎㅎ
    이벤트 구조의 경우 공감이 가기도 하고.. 애매 하기도 하고.. 경험이 적다보니 이벤트로 인한 속도문제는
    크게 겪어 본 적이 없는 부분이었는데 많은 도움이 됬습니다^^ 1페이지부터 정주행 중인데 332까지 얼른 읽어야 겠네요^^

    2011/05/11 15:22 [ ADDR : EDIT/ DEL : REPLY ]
  14. 액션푸우

    와우~~!! 공감도 가고 좋은 글이네요. 디자인 패턴을 공부해야하는 개발자로써 어떻게 보면 닭이 먼저인지 달걀이 먼저인지 생각이 들기도 했었거든요. 그리고 클래스의 재사용성~~!! 작업을 하면서 실제로 가져다가 다시 수정해서 쓰고 있는 그대로 쓰는 경우가 드물게 느껴져서 내가 잘못 만들고 있는건가 하는 생각도 들었습니다. 이 글을 보니 제가 잘못된 방향으로 하는 건 아니라고 느꼈습니다..~~!!

    2011/07/22 09:45 [ ADDR : EDIT/ DEL : REPLY ]

저도 Workspace를 두 세개 정도 쓰고 있는데

매번 재시작하기 불편해서 workspace를 안쓰시는 분들이 꽤 있는 것 같습니다.

방법은 간단합니다.

단축아이콘을 만드시고 아래 사진과 같이



실행 파일이 적혀 있는 "대상" 필드에

다음과 같이 옵션을 주면 됩니다.

FlashBuilder.exe -data [WORKSPACE]

예) "C:\Program Files\Adobe\Adobe Flash Builder 4\FlashBuilder.exe" -data "D:\Work\workspace\"

그러면 각 Workspace마다 다른 프로그램처럼 별도의 빌더로 실행됩니다.

For the better~!!!

저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 메타콰이어

    오..... 멋져부러여 ㅋㅋㅋㅋㅋ

    2011/03/31 10:26 [ ADDR : EDIT/ DEL : REPLY ]

ActionScript 3.0/Away3D2011/02/28 16:09

- Away3D 4 (Flash Player 11, Molehill)


- Away3D 3.6 (Flash Player 10.1)


그냥 기초적으로 만들어서는 빠르지 않네요...

뭐 렌더러를 바꾸거나 뭐 어떻게 해야되는가봐요...

>.<




p.s) 몰랐는데 첫번째꺼랑 두번째꺼랑 제가 구현한게 기능상으로 차이가 큰거더군요.

첫번째 샘플에서 저렇게 쉐이딩되는게 엄청 부하 먹는거더라구요...

참고로 첫번째꺼랑 두번째거랑 비슷한 프레임으로 나온다면 Molehill이 굉장히 좋은거라는 겁니다. ㅋ
저작자 표시 비영리 동일 조건 변경 허락

'ActionScript 3.0 > Away3D' 카테고리의 다른 글

Away3D 4 Molehill 테스트  (4) 2011/02/28
[Away3D] 와 3D 엔진 대단하네요.  (8) 2008/05/02
Posted by 우야꼬 

댓글을 달아 주세요

  1. 우오~~ 벌써 테스트 파일을 올리시다니 정말 빠르십니다. 저도 빨리 테스트해보고 싶어지네요!!

    2011/02/28 19:39 [ ADDR : EDIT/ DEL : REPLY ]
  2. wmode = "direct" 추가 하셔야 해요.

    형 샘플로 테스트 해보았는데.
    param 추가하면 메모리 24 정도로 굉장히 줄어드네요.

    Molehill 만쉐이 ㅠㅠ

    2011/03/04 09:58 [ ADDR : EDIT/ DEL : REPLY ]
    • 아 gpu로 했더니 아무 반응 없길래 그렇구나 했더니 ㅋ direct 였구나 굿 정보~

      2011/03/04 10:28 [ ADDR : EDIT/ DEL ]
    • Flash Builder가 아닌 Cs5.5에서 플레이어 11이랑
      AIR3.0 세팅하고 하는데 wmode = "direcr"
      요 기능은 어떻게 추가 하나요?
      app_xml에
      <application android:hardwareAccelerated="true"/> 추가 하니 StageVideo는 되는데 Away3D 4.0은 모바일이 ConText3D가 지원 안된다구 에러 뜨고 퍼플리싱해도 안보이더라구요.

      2011/11/26 01:36 [ ADDR : EDIT/ DEL ]

두달만에 쓰는 글 치고는 좀 심심하지만

간만에 팁을 올립니다. ㅎㅎ

무심코 다른 언어 습관때문에 숫자형을 문자형으로 바꿀 때 toString() 을 썼는데

소연이가 toString() 대신에 String() 을 쓰길래

어?

해서 한 번 테스트를 해보았더니

생각보다 꽤 큰 차이를 보이더군요.

일단 테스트 코드갑니다.

var i: int;
var count: int = 100000;

i = count;

var n: Number = 150;
var time: int = getTimer();

while( i-- )
     n.toString();
    
time = getTimer() - time;

trace( time );

i = count;

time = getTimer();

while( i-- )
     String( n );
    
time = getTimer() - time;

trace( time );

테스트 코드는 위와 같고 제 컴퓨터에서 테스트한 결과들을 보여드리겠습니다.

var n: Number = 150
toString()    43ms
String()    32ms (34% faster)

var n: Number = 49394929
toString()    51ms
String()    36ms (41% faster)

var n: Number = 23.20154
toString()    231ms
String()    221ms (4.5% faster)

var n: Number = -1548
toString()    45ms
String()    34ms (32% faster)

var n: Number = NaN
toString()    29ms
String()    17ms (70% faster)

var n: int  = 1823422;
toString()    54ms
String()    35ms (54% faster)

var n: int  = -3422;
toString()    52ms
String()    33ms (57% faster)

var n: uint  = 548422;
toString()    53ms
String()    34ms (55% faster)

오옷!!!

전체적으로 String()이 약 20~50% 빠른걸 알 수 있습니다.

도대체 toString() 내부와 String() 내부는 어떻게 다르기에 이렇게 다른걸까요?

흠...

어쨌든 앞으로는 String() ㄱㄱ
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 음... 진수변환 같은게 더 들어있어서 그런 것 아닐까요?

    2010/11/09 17:32 [ ADDR : EDIT/ DEL : REPLY ]
  2. 메타콰이어

    엌..... toString() 이 더 좋은줄 알고 대부분의 소스를 toString() 으로 했는데

    2010/11/11 21:32 [ ADDR : EDIT/ DEL : REPLY ]
  3. 웅스

    지금까지 toString 말고 String() 으로 작업하고 있었는데, 그게 좋은거였나봐요 으흐흐..
    언제나 야꼬님의 글 감사하게 보구 가요^^/

    2010/11/09 18:20 [ ADDR : EDIT/ DEL : REPLY ]
  4. 뽀루꾸

    앗..나도 toString로 사용햇는데...흐미;;

    2010/11/09 18:42 [ ADDR : EDIT/ DEL : REPLY ]
  5. 커스텀 클래스의 경우, toString()은 각 클래스마다 구현해야 동작해서 좀 귀찮기도 해요. 반면 (개인적으로는) String()에 비해 좀 더 잘 읽히기 때문에 아직까지는 주로 toString()을 쓰고 있어요.
    반면 Number 클래스의 경우에는 타 언어에서도 가끔 String()과 같이 캐스팅해서 쓰는 경우가 있어서 그런지, String()을 더 자주 쓰게 되네요.

    2010/11/10 07:31 [ ADDR : EDIT/ DEL : REPLY ]
  6. String() 이 빠르군요!
    앞으로 애용해야겠어요 ㅎㅎ

    고맙습니다.

    2010/11/18 23:36 [ ADDR : EDIT/ DEL : REPLY ]
  7. 그러니까 형() 구문은 형치환구문이라고 해서 어셈블리를 까보면 직접 형을 캐스팅하는 걸로 해석이 되어있어.
    반면에 toString()은 말 그대로 메서드를 호출하는 구문이 되어 함수를 실행한 결과를 반환하지.
    오히려 함수호출이 생각보다 부하가 안걸리네! 훌륭한걸 이라고 칭찬해줄 지경 ^^

    2010/12/21 23:24 [ ADDR : EDIT/ DEL : REPLY ]
    • 아마 속도의 차이는 캐스팅할 때 상속 체인이 아니기 때문에 별도의 프로세스를 거치는데 거기에서 toString()과는 다른 조치를 취하는거 같아여.

      예를 들면 toString()은 갖은 속성을 검사하는데
      상속 체인이 아닌 객체를 캐스팅할 때는 걍 값만 갖고 와서 넣어버린다던가 하는게 아닌가 싶네요.

      아 뜯어보고 싶네요 ㅎㅎ

      2010/12/23 18:51 [ ADDR : EDIT/ DEL ]
  8. 언어를 디자인한 사람의 설계의도를 읽어야 하는 부분 같은데..

    toString은 타입케스팅 용도가 아니라 오브젝트를 설명하는 용도로 설계된거 거든.
    그래서 보통은 toString을 오버라이딩 해서 해당 클래스의 메타데이타를 문자열 형태로 반환하도록 구현하지.

    (Person instance).toString(); // "Name: wooyaggo, Age: 31, Class:World Class!!"

    대강 요런식으로. 무엇을 반환할지는 개발자의 몫!
    Number 클래스의 경우엔 그 구현이 "Numeric Value=>String"의 구현일거고, 이경우엔 잘 맞는 구현이지.

    내 생각엔 toString을 타입 캐스팅 용도로 사용한다면, 애써 설계해서 상속체인 맨 꼭대기에 넣어둔 설계자가 땅을치며 후회할일 같네 ㅋㅋ


    간만에 와서 안부도 안물어보고 참견질 ㅎㅎ

    2011/02/17 11:04 [ ADDR : EDIT/ DEL : REPLY ]
    • 구혁이?
      오 올만~
      그러게 이야기 듣고 보니까
      플래시에서는 숫자를 문자열로 변환하는게 다른 방법이 없어서 막연하게 사용했었는데
      방법은 같더라도 목적을 제대로 알아야겠네^^
      역시 달라~ 멋져~

      2011/02/18 15:55 [ ADDR : EDIT/ DEL ]

짧게 쓸 수 있는 반복문 팁입니다.



1. 0부터 9까지 10번 돌리기

보통

var i: int = 0;
var len: int = 10;

for( i = 0 ; i < len ; i++ )
{
     test = i;
}

이렇게 쓰죠.

for( 초기화 ; 조건문 ; 반복문 )

요로케 쓰면 조금더 코드가 줄어듭니다.

var i: int = 0;
var len: int = 10;

for( ; i < len ; i++ )
{
     test = i;
}

for( ; 조건문 ; 반복문 )

코드가 코딱지 만큼 줄어들고

속도도 코딱지 만큼 빨라집니다. (약 1.1% 정도)



2. 1부터 10까지 돌리기

대게 이렇게 쓰죠

var i: int = 1;
var len: int = 10;

for( i ; i <= len ; i++ )
{
     test = i;
}

아래처럼 쓰면 코드가 몇개나마 줄어듭니다.

var i: int = 0;
var len: int = 10;

for( ; i++ < len ; )
{
     test = i;
}

속도도 코딱지 만큼 빨라집니다.

약 5.5% 정도?



3. 무조건 10번 돌리기

보통 10번 돌리면 이렇게 많이 쓰죠.

var i: int = 0;
var len: int = 10;

for( i = 0 ; i < len ; i++ )
{
     test = i;
}

다음과 같이 쓰면 코드도 대폭 줄어들고 속도도 코딱지 만큼 빨라집니다.

var i: int = 10;
while( i-- )
{
     test = i;
}

코딩은 많이 줄어드는데 속도도 옵션으로 약 0.8%정도 빨라집니다 후후후...





-_-)γ
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 
TAG FOR, Loop, TIP, while,

댓글을 달아 주세요

  1. 인수받는 개발자의 어그로도 올라감.. ㅋㅋ

    2010/07/28 17:17 [ ADDR : EDIT/ DEL : REPLY ]
  2. ++i 이 더 빠르다고 함! ^^

    2010/07/28 21:37 [ ADDR : EDIT/ DEL : REPLY ]
    • 아 맞아요!! ㅋㅋㅋ

      2010/08/03 14:42 [ ADDR : EDIT/ DEL ]
    • 무슨 근거인지는 기억도 안나는데 그게 좋다고 습관으로 되었던게 다행이네요 흐흐.

      2010/08/07 14:52 [ ADDR : EDIT/ DEL ]
  3. 글제목대로라면 정답은 test=(0,1,2,3,4,5,6,7,8,9);

    2010/07/29 03:45 [ ADDR : EDIT/ DEL : REPLY ]
  4. 왠지 익숙하지 않는 구문은 불안해서 못쓴다는 소심증ㅇㅇ..bugging me..more more

    2010/07/29 02:56 [ ADDR : EDIT/ DEL : REPLY ]
  5. 코어한 로직이 아닌데 저렇게 해놓으면 때릴꺼야!!

    2010/08/02 12:10 [ ADDR : EDIT/ DEL : REPLY ]
  6. ㅠㅠ 이런 코드가 있으면 울고 싶을것같아요

    2010/08/03 13:22 [ ADDR : EDIT/ DEL : REPLY ]
  7. 좋은 정보!!!
    욱욱!!

    감사감사

    2010/08/10 10:45 [ ADDR : EDIT/ DEL : REPLY ]
  8. 지나가다 한마디

    저렇게 해서 코드를 괜히 복잡하게 하지 마시고...;;;
    i++ 를 ++i 로 바꾸시면 그 자체만으로 이미 성능이 다릅니다.

    대충 휘갈기면 다음과 같습니다

    function ppi( i:integerObject ):int{ // ++i
    return i.value += 1;
    }

    function ipp( i:integerObject ):int { // i++
    var r:int = i;
    i.value += 1;
    return r;
    }

    2010/10/12 22:42 [ ADDR : EDIT/ DEL : REPLY ]

Compiler Options


저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 자, 다음 포스팅은 이 글 번역...

    2010/08/03 12:53 [ ADDR : EDIT/ DEL : REPLY ]

이번 Flash Player 10.1에서는 많은 기능들이 추가되었다.

특히 모바일에 최적화되는 업데이트가 많았는데 그 밖에도 Flash에 몇 가지 큰 기능들이 추가되었다.

하나씩 살펴보자.



1. 에러창을 없애보자.



예기치 못하게 나타나는 Flash 에러창은 사용자나 개발자 모두에게 당황스러운 경험일 것이다.

개발하는 입장에서도 모든 에러를 예상하기란 쉽지 않은 일이고

사용자 입장에서 이제는 어느정도 당연스럽게 여기는 지경이다.

이번 Flash Player 10.1에서는 예상하지 못한, 즉 미리 처리해놓지 않은 에러들을 한 곳에서 처리할 수 있게 되었다.

잡히지 않은 에러라는 뜻으로 UncaughtErrorEvent라는 이벤트가 사용된다.

UncaughtErrorEvent는 각 SWF마다 하나의 장소로 모이게 된다.

어디서 에러가발생하건간에 SWF의 LoaderInfo객체 전달된다. 즉 UncaughtErrorEvent를 사용하는 방법은 다음과 같다.

import flash.events.UncaughtErrorEvent;

this.loaderInfo.uncaughtErrorEvents.addEventListener( UncaughtErrorEvent.UNCAUGHT_ERROR, globalErrorHandler );

function globalErrorHandler( $e: UncaughtErrorEvent ): void
{
     trace( "Global Error : " + $e.error );
}

각 SWF마다 uncaughtErrorEvents라는 속성이 새로 추가되었다.

이 객체는 처리되지 못한 에러들이 지나가는 길이라고 생각하면 된다.

이 객체에게 UncaughtErrorEvent 이벤트를 받아 리스너를 등록해놓으면 된다.

실제로 사용하는 코드는 다음과 같다.

import flash.events.UncaughtErrorEvent;
import flash.errors.IllegalOperationError;
import flash.events.MouseEvent;

this.loaderInfo.uncaughtErrorEvents.addEventListener( UncaughtErrorEvent.UNCAUGHT_ERROR, globalErrorHandler );

function globalErrorHandler( $e: UncaughtErrorEvent ): void
{
     trace( "Global Error : " + $e.error );
    
     switch( $e.error.constructor )
     {
          case SecurityError :
               trace( "security error occured." );
               break;
         
          case IllegalOperationError :
               trace( "works wrong." );
               break;
              
          default :
               trace( "Unexpected error occured." );
               break;
     }
    
     $e.preventDefault();
}

this.stage.addEventListener( MouseEvent.CLICK, clickListener );

function clickListener( $e: MouseEvent ): void
{
     throw new SecurityError( "Do" );
}

위 코드에서는 예상하지 못한 에러가 발생했을 경우 에러의 종류에 따라 행동을 달리 하는 코드다.

그리고 globalErrorHandler의 마지막구문인 preventDefault 메소드를 호출함으로써 해당 에러를 소멸시키는 것이다.

단 UncaughtErrorEvent를 구현하면서 주의할 점은

예상하지 못한 에러가 발생할 경우 더 이상 Flash가 진행할 수 있는지 없는지는 개발자가 판단하여 사용자의 진행을 중지시키거나 다른 쪽으로 유도하는 장치가 마련되어 있어야한다.

에러라는 성격자체가 프로세스가 정상적으로 진행되지 못함을 의도하는 것이기 때문에

어떤 예상치 못한 에러가 발생하더라도 프로세스를 정확하게 보장해야하는 몫은 여전히 남아있는 것이다.



2. 마이크를 다뤄보자.

예전에는 마이크에서 받아오는 사운드는 단지 볼륨 조절 수준 밖에 할 수 없었다.

하지만 이번에 새로 추가된 Microphone 클래스에서는

SampleDataEvent.SAMPLE_DATA라는 이벤트가 발생하게 되어

마이크에서 들어오는 사운드를 바이트 수준에서 처리할 수 있게 되었다.

마이크에서 들어오는 사운드를 캡쳐하는 방법은 다음과 같다.

import flash.media.Microphone;
import flash.events.SampleDataEvent;
import flash.utils.ByteArray;

var mic: Microphone = Microphone.getMicrophone();

if( mic == null )
     return;
    
mic.gain = 44;
mic.rate = 60;
mic.setUseEchoSuppression( true );
mic.setLoopBack( false );
mic.addEventListener( SampleDataEvent.SAMPLE_DATA, micSampleHandler );

function micSampleHandler( $e: SampleDataEvent ): void
{
     this.sample = $e.data;
    
     trace( this.sample.bytesAvailable );
}

var sample: ByteArray;

위 코드를 1 Frame에 넣고 실행하면 다음처럼 마이크 입력을 받을 것이냐는 확인 창이 나타난다.



“허용”을 누르면 이때부터 마이크에 사운드가 입력될 때 마다 SampleDataEvent.SAMPLE_DATA이벤트가 발생하게 된다.

여기서 받아오는 사운드 데이터를 sample이라는 변수에 저장해놓는 것이다.

위 예제에서는 setLoopBack( false )를 함으로써 마이크에서 들어오는 사운드를 스피커로 재생하지 않도록 해놓았다.

아래 예제에서는 이렇게 받아온 사운드 데이터를 직접 Sound클래스를 통해서 재생하는 방법을 살펴보겠다.

import flash.media.Microphone;
import flash.events.SampleDataEvent;
import flash.utils.ByteArray;
import flash.media.Sound;

var mic: Microphone = Microphone.getMicrophone();

if( mic == null )
     return;

mic.gain = 44;
mic.rate = 60;
mic.setUseEchoSuppression( true );
mic.setLoopBack( false );
mic.addEventListener( SampleDataEvent.SAMPLE_DATA, micSampleHandler );

function micSampleHandler( $e: SampleDataEvent ): void
{
     this.sample = $e.data;
    
     this.sound.play();
}

var sample: ByteArray;

var sound: Sound = new Sound;
sound.addEventListener( SampleDataEvent.SAMPLE_DATA, soundSampleHandler );

function soundSampleHandler( $e: SampleDataEvent ): void
{
     var i: int = 8192;
     var float: Number;
     while( i-- && this.sample.bytesAvailable )
     {
          float = this.sample.readFloat();
         
          $e.data.writeFloat( float );
          $e.data.writeFloat( float );
     }
}

마이크를 통해서 사운드가 들어올 때마다 sample에 사운드 데이터를 저장하고 Sound.play()를 통해 사운드를 재생시킨다.

그 이유는 Sound객체가 사운드를 재생하려고 할 때 재생할 데이터가 없으면 SampleDataEvent.SAMPLE_DATA 이벤트가 발생하는데

이때 재생할 데이터를 넣어주면 Sound는 그 데이터를 재생하게끔 되어 있기 때문이다.

사운드 데이터는 8192 크기의 사운드이지만 간혹 그 이상의 데이터가 들어올 경우가 있다.

하지만 유효한 데이터의 크기는 무조건 8192이기때문에 사운드 데이터를 사용할 때는 다음과 같이 사용하도록 한다.

function soundSampleHandler( $e: SampleDataEvent ): void
{
     var i: int = 8192;
     var float: Number;
     while( i-- && this.sample.bytesAvailable )
     {
          float = this.sample.readFloat();
         
          $e.data.writeFloat( float );
          $e.data.writeFloat( float );
     }
}

위 예제를 실행한 후에 마이크에 말을 하게 되면 직접 스피커로 재생되는 것을 볼 수 있을 것이다.

이처럼 Flash Player 10.1에서는 마이크에서도 사운드 데이터를 직접 활용할 수 있게 되었다.

또 뿐만아니라 mp3 에서도 512크기의 샘플 데이터를 추출할 수 있게 되었다.

이를 활용하면 리듬 게임같이 사운드를 정밀하게 다루는 게임도 만들 수 있게 된 것이다.

앞으로 사운드를 활용한 다양한 서비스들이 나타나지 않을까 예상된다.



3. 보다 세밀해진 국가별 언어 서비스

이번 Flash Player 10.1에서는 flash.globalization이라는 패키지가 추가됐다.

나라마다 다른 화폐 단위나 문자등을 보다 세밀하게 다룰 수 있게 되었다. 하나씩 살펴보도록 하자.

먼저 사용할 수 있는 Locale의 종류를 알아봐야한다. Locale이란 국가별 언어의 종류라고 볼 수 있다.

미국에서 쓰는 영어는 en-US라고 하고 한국은 ko-KR, 일본은 ja-JP라고 한다.

Locale을 설정하는 방법을 살펴보자.

import flash.globalization.LocaleID;

var locale: LocaleID = new LocaleID( "en_US" );

locale은 이제 앞으로 사용될 언어 설정에서 미국의 영어로 설정되어질 것이다.

이 Locale설정으로 “adobe”와 “Adobe”가 같은 단어인지를 판별하는 메소드를 만들어보자. 

문자열을 비교하는데는 Collator 클래스가 사용된다. 아래는 Collator를 이용해서 문자열을 비교하는 코드이다.

import flash.globalization.LocaleID;
import flash.globalization.Collator;
import flash.globalization.CollatorMode;

var locale: LocaleID = new LocaleID( "en_US" );

var collator: Collator = new Collator( locale.name, CollatorMode.MATCHING );
trace( collator.equals( "adobe", "Adobe" ) ); // true

locale을 설정하고 Collator의 모드를 비교로 설정한 후 두 문자열을 비교하면 두 문자열이 같은 단어인지를 판별해준다.

이번엔 정렬하는 Collator를 살펴보자.

import flash.globalization.Collator;

var text: Array = [ "cafe", "cafe", "cafe" ];

text.sort( new Collator( "en_US" ).compare );

trace( text ); // cafe,cafe,cafe

text.sort( new Collator( "fr_FR" ).compare );

trace( text ); // cafe,cafe,cafe

배열의 정렬 메소드인 sort 메소드에 각 Collator의 compare 메소드를 파라미터로 정렬을 하게된다.

이처럼 각 국가별로 다른 언어 체계에 맞춰서 대응할 수 있다.

다음은 화폐 단위에 대한 클래스인 CurrencyFormatter를 살펴보자.

미국은 달러($)를 사용하고 한국은 원(₩)을 사용한다.

이처럼 복잡한 화폐 체계에 대응하기 위한 클래스이다.

국가별 단위를 얻는 방법은 다음과 같다.

import flash.globalization.CurrencyFormatter;

var koreaCurrency: CurrencyFormatter = new CurrencyFormatter( "ko_KR" );
trace( koreaCurrency.currencyISOCode ); // KRW
trace( koreaCurrency.currencySymbol ); // ₩

var usCurrency: CurrencyFormatter = new CurrencyFormatter( "en_US" );
trace( usCurrency.currencyISOCode ); // USD
trace( usCurrency.currencySymbol ); // $

언어별로 화폐 코드와 기호를 나타냅니다.

이번에는 숫자를 화폐단위를 적용하여 출력하는 방법을 알아보자.

CurrencyFormatter의 format 메소드는 정해진 속성들에 따라서 숫자를 출력하는 메소드다.

구분점을 찍어주는 groupingFormat을 이용해서 출력해보자.

import flash.globalization.CurrencyFormatter;

var money: int = 100000000;

var koreaCurrency: CurrencyFormatter = new CurrencyFormatter( "ko_KR" );
koreaCurrency.groupingPattern = "4;*";
trace( koreaCurrency.format( money, true ) ); // ₩1,0000,0000

var usCurrency: CurrencyFormatter = new CurrencyFormatter( "en_US" );
usCurrency.groupingPattern = "3;*";
trace( usCurrency.format( money, true ) ); // $100,000,000.00

실제로 쓰이진 않지만 한국어로 읽기 편하게 한국 화폐단위는 4 자리로, 미국은 3자리로 구분해서 출력한다. format의 두번째 파라미터는 화폐 단위를 붙일 것인지를 결정한다. 여기서 사용되는 패턴은 다음과 같다.

“2;3;*” - 2는 소숫점 구분 후 첫번째 그룹을 지을 갯수, 3은 그 다음 숫자를 그룹지을 갯수, 그리고 *는 나머지 모두에 적용한다는 것을 의미한다.

10000000000 을 예로 들어보자.

“2” - 100000000,00
“2;3” - 100000,000,00
“2;*” - 1,00,00,00,00,00
“2;3;*” - 100,000,000,00

이처럼 Flash Player 10.1에서는 화폐와 언어에 대해서 매우 정밀해졌다. 그 밖에도 날짜를 보다 다양하게 설정할 수 있는 DateTimeFormatter와 숫자를 설정할 수 있는 NumberFormatter가 새롭게 추가되었다.



4. 메모리

이번에 모바일에 최적화에 맞춰 많은 것들이 향상되었는데 그 덕분에 Flash Player에서 이제 메모리에 관련되어 많은 것들을 알 수 있게 되었다.

import flash.system.System;

trace( System.freeMemory ); // 2306048

freeMemory는 Flash Player가 사용할 수 있는 남은 메모리를 말한다.

이는 시스템의 전체 메모리와는 달리 Flash Player에게 할당된 메모리중 아직 사용하지 않은 메모리를 뜻한다.

import flash.system.System;

trace( System.privateMemory ); // 376557568

privateMemory는 브라우저를 포함해 전체 프로세스에 관련된 현재 사용중은 전체 메모리를 말한다.

AIR에서는 애플리케이션이 사용하는 전체 메모리를 이야기한다.

import flash.system.System;

trace( System.totalMemoryNumber ); // 29937664

기존의 totalMemory는 uint속성이기 때문에 4기가 이상의 용량을 표시할 수 없었다.

이번 Flash Player 10.1에서는 totalMemoryNumber 속성이 Number 값으로 반환하여 더 큰 메모리도 파악할 수 있게 되었다.




p.s 1) 이 글은 어도비에 기술문서로 올라가게되면 삭제될 수도 있습니다. (I hope this wouldn't happen.)

p.s 2) "new Sound();"가 아니라 "new Sound;" 라고 해놓것은 오타가 아닙니다. 이는 어도비가 생성자에 파라미터가 필요없을 경우 () 이것을 빼는 것을 권하고 있습니다. 실제로도 "new Sound();" 보다 "new Sound;" 가 객체 생성 시간이 약~간 빠릅니다. :)
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 와 좋다.
    넌 참 훌륭한 사람이야.

    2010/07/23 11:13 [ ADDR : EDIT/ DEL : REPLY ]
  2. 마넴이리

    와~ 완전 열심히인데! ㅎ 훌륭한 사람이야

    2010/07/23 11:40 [ ADDR : EDIT/ DEL : REPLY ]
  3. 빠따

    오...좋은글 감사요.ㅋ

    2010/07/23 11:42 [ ADDR : EDIT/ DEL : REPLY ]
  4. 사람이시긴 하십니까!!??
    헐.....
    대단하십니다.

    2010/07/23 11:43 [ ADDR : EDIT/ DEL : REPLY ]
  5. 닥서클

    형 잘보고가용^-^

    2010/07/23 11:49 [ ADDR : EDIT/ DEL : REPLY ]
  6. 찰카닥

    와 멋짓글이네요^^ 궁금한것들이였는데 또한번 배움을 보네요 d(+_+)b

    2010/07/23 11:51 [ ADDR : EDIT/ DEL : REPLY ]
  7. rewindme

    잛보고 갑니다. 사운드 클래스로 음성변조하는 음성채팅 어플 만들면 재밌겠네용 ㅋ

    2010/07/23 12:01 [ ADDR : EDIT/ DEL : REPLY ]
  8. 괄호 빼는게 빠르다는건 처음 알았네요 ㅎㅎ..

    2010/07/23 12:40 [ ADDR : EDIT/ DEL : REPLY ]
    • 그져? 근데 잘 손에 안익어요... 보기에도 뭔가 좀 허해보이고... 걍 생각나면 쓰고 안나면 안쓰고 그래여 -_-

      2010/07/23 15:42 [ ADDR : EDIT/ DEL ]
  9. 야훔

    멋지세요! 짱짱 (=_=)b

    2010/07/23 12:46 [ ADDR : EDIT/ DEL : REPLY ]
  10. 오 언제 정리를 다 ㅋㅋ
    수고하셨어요.
    녹음하는거 가지고 재밌는거 많이 만들수 있을듯 ㅎㅎ

    2010/07/23 13:34 [ ADDR : EDIT/ DEL : REPLY ]
    • 만들어줘!!
      너네 포켓몬 카드 그런거 하니까
      마이크에다 "공격으로 하고 턴을 넘기겠다!!" 막 이런거 하면
      실제로 입력되게 해줘.
      해줘~
      해줘~!!

      2010/07/23 15:43 [ ADDR : EDIT/ DEL ]
  11. 귀뫄뉘

    훌륭하십니다!!!!!

    2010/07/23 15:37 [ ADDR : EDIT/ DEL : REPLY ]
  12. 달고양이

    이여어어어어어얼~~
    내용도 멋지고 정리한 사람도 멋지고~!!!
    ㅋㅋㅋㅋㅋㅋㅋㅋ
    마이크 재밋겟음+_+

    2010/07/23 17:21 [ ADDR : EDIT/ DEL : REPLY ]
  13. 메타콰이어

    역시 짱!!! ㅋㄷ

    2010/07/23 21:23 [ ADDR : EDIT/ DEL : REPLY ]
  14. 우오왕. 에러창 맘에 든다.
    게다가 마이크!! "크오만ㅇ뢍왕 ㅇ나ㅣ러나일ㅇ캉!!"

    2010/07/25 03:14 [ ADDR : EDIT/ DEL : REPLY ]
    • ㅇㅇ 에러창 진짜 유용해 근데 가끔 빠져나가는 이벤트가 날 괴롭히지...

      2010/07/25 18:34 [ ADDR : EDIT/ DEL ]
  15. 파퓨표

    오옷! ㅎㅎ 멋지심 ㅋㅋㅋ
    바쁜 와중에도 이런걸... ㅎㅎㅎ

    2010/07/25 16:32 [ ADDR : EDIT/ DEL : REPLY ]
    • 쓴지 좀 오래 됐어 ㅎㅎ 한 삼주 됐나
      나도 잊고 있다가 올린거얌 ㅎㅎ

      2010/07/25 18:34 [ ADDR : EDIT/ DEL ]
  16. 훌륭하네.. ^^

    2010/07/27 10:44 [ ADDR : EDIT/ DEL : REPLY ]
  17. 고맙습니다!
    좋은 정보들이네요!!

    2010/08/03 13:30 [ ADDR : EDIT/ DEL : REPLY ]
  18. 금돌

    오~ 멋진정보 감사요~

    2010/08/24 15:56 [ ADDR : EDIT/ DEL : REPLY ]
  19. andwhy

    어째서...플래시 관한 모든 구글링은 니 블로그로 이어지는거냐!!!

    2011/12/27 14:50 [ ADDR : EDIT/ DEL : REPLY ]

Flash Player 10.1이 정식으로 릴리즈 됐습니다.

여러가지 기능들이 추가되었습니다.

이 기능들을 개발하는데 적용하기 위해서 어떻게 설정해야되는지 살펴보겠습니다.

-_-)b

1. 먼저 Adobe Labs에서 Flash Player 10.1 용 playerglobals.swc 라이브러리를 다운받습니다.



2. Flash Builder의 SDK 폴더에서 (C:\Program Files\Adobe\Adobe Flash Builder 4\sdks\) 현재는 "10.0"이라는 폴더밖에 없을 겁니다. 이곳에 10.1 이라는 폴더를 만들어주세요.



3. 10.1 폴더에 다운받은 swc를 복사합니다. 이제 SDK는 준비가 다 되었습니다. 프로젝트로 가서 다음과 같이 설정합니다.



4. 프로젝트의 "Properties" 속성에 들어갑니다.



5. 그리고 Flash Player 버전을 10.1 로 설정합니다.



6. 이제 모든 설정이 끝났습니다. 이번 Flash Player 10.1 에 새롭게 생긴 UncaughtErrorEvent를 사용할 수 있게 되었습니다.









저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 찰카닥

    굿~ 감사합니다.~

    2010/07/01 15:42 [ ADDR : EDIT/ DEL : REPLY ]
  2. 역시 여기는 금광이군요 ! =_=b

    2010/07/01 16:05 [ ADDR : EDIT/ DEL : REPLY ]
    • 옙 여기는 금광입니다.

      그럼 야꼬는 탄광촌에 사는건가

      2010/07/01 16:41 [ ADDR : EDIT/ DEL ]
  3. 멋진놈

    2010/07/01 17:11 [ ADDR : EDIT/ DEL : REPLY ]
  4. 쫑쫑쫑

    진짜 능력도 좋고 멋진데 .....

    2010/07/01 20:17 [ ADDR : EDIT/ DEL : REPLY ]
  5. carpediem

    이거혹시 안드로이드2.2에 적용된다는 10.1 그것인가요!?

    2010/07/01 21:41 [ ADDR : EDIT/ DEL : REPLY ]
  6. 차망

    항상좋은정보 감사합니다~ㅎㅎ

    2010/07/02 09:27 [ ADDR : EDIT/ DEL : REPLY ]
  7. UncaughtErrorEvent... pfg 때 들었던 것 같은데 뭔가 가물가물 하네요 ㅋ..

    2010/07/02 13:34 [ ADDR : EDIT/ DEL : REPLY ]
  8. 메타콰이어

    굿드!!!

    2010/08/03 11:32 [ ADDR : EDIT/ DEL : REPLY ]

HTML5에 드래그앤 드랍 기능이 추가되었습니다.

그 기능을 이용해서 브라우져에 드래그앤드랍으로 가져온 파일을

플래시로 전달하는 기능입니다.

현재는 파이어폭스에서밖에 지원하지 않기 때문에

(크롬은 아직 중요한 메소드를 지원하지 않고 있네요)

소스 공개는 나중에~ (디컴파일해도 소용없어효~)

FireFox에서 보세요 : http://as3.kr/etc/dnd/

위 페이지를 연 후에

탐색기 또는 파인더에서 이미지 파일을 Drag And Drop 으로 떨구시면

플래시에서 이미지가 로드되는 것을 볼 수 있습니다.

  




For the better.
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. swf 파일을 갖다 집어넣었는데 재생되네요?!

    2010/05/14 18:00 [ ADDR : EDIT/ DEL : REPLY ]
  2. jebop

    이런건 처음 보네요~ ㅎ 어떤식으로 사용이 되면 좋을까요~ 암튼 재밌습니다..^^

    2010/05/14 18:22 [ ADDR : EDIT/ DEL : REPLY ]
    • 사용할곳은 무궁무진하죠~
      다만 모든 브라우져에서 지원되는게 아니니 대안이 필요하다는게 가장 큰 문제긴 하지만
      앞으로 많은 곳에서 사용하게 되지 않을까 합니다.

      2010/05/14 18:49 [ ADDR : EDIT/ DEL ]
  3. 오 이거 멋진듯~!

    2010/05/14 18:41 [ ADDR : EDIT/ DEL : REPLY ]
  4. 오! html5 와 flash 연동!
    html5 에서 이미지 로컬 정보를 코드단으로 떨어뜨려 주는거 아닌가요? ㅎㅎ (아닌가?;;;)
    암튼 잘 봤습니다. ^^

    2010/05/14 19:13 [ ADDR : EDIT/ DEL : REPLY ]
    • 역시 한 번에 알아보시는군요^^
      파일 데이터를 플래시로 가져오는데 고생 좀 했어여 ㅎㅎ

      2010/05/14 20:15 [ ADDR : EDIT/ DEL ]
  5. 와우 완전 멋져요 ㅎㅎㅎ

    2010/05/14 19:36 [ ADDR : EDIT/ DEL : REPLY ]
  6. 좋쿠나~

    2010/05/14 20:03 [ ADDR : EDIT/ DEL : REPLY ]
    • 플래시라고 무조건 HTML5의 피해자라고 생각할건 없을거같애

      2010/05/14 20:13 [ ADDR : EDIT/ DEL ]
  7. 투더리

    현재는 파이어폭스에서밖에 지원하지 않기 때문에
    (크롬은 아직 중요한 메소드를 지원하지 않고 있네요)

    현재는 파이어폭스에서밖에 지원하지 않기 때문에
    (크롬은 아직 중요한 메소드를 지원하지 않고 있네요)

    현재는 파이어폭스에서밖에 지원하지 않기 때문에
    (크롬은 아직 중요한 메소드를 지원하지 않고 있네요)

    .
    .
    .

    -_ -"
    아까 메신저 내용 복사해둘껄..

    2010/05/14 23:50 [ ADDR : EDIT/ DEL : REPLY ]
  8. 우오~! 최곱니다 ㅡㅡb

    2010/05/15 10:56 [ ADDR : EDIT/ DEL : REPLY ]
  9. 미오기

    오랜만이얌~ 이것저것 둘러보고 있는데 역쉬 대단하네~ 근데 난 왜 안될까..ㅋㅋ 파이어폭스 최신꺼로 깔았는뎅..ㅠㅠ

    2010/12/29 17:20 [ ADDR : EDIT/ DEL : REPLY ]

보통 배열을 쓸 때

배열을 다시 짜거나 초기화 시켜야할 때 다음과 같이 많이 쓰죠.

arr = [];

하지만 다음과 같이 사용하면 약 3배 정도 퍼포먼스를 향상시킬 수 있습니다.

arr.length = 0;

length가 read-only라고 생각하고 계셨을 수도 있지만 length 값은 read-write 입니다.

배열의 길이를 0으로 해버리면 모든 원소를 날리고 초기화가 됩니다.

[] 명령어 자체도 new 와 마찬가지이기 때문에

새로운 객체를 만드는 것보다는 길이를 줄이는게 빠른 요인인것 같습니다.

다음과 같이 몇가지 테스트를 더 해봤습니다.

import flash.utils.getTimer;

function test1(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     arr = [];
    
     return arr.length;
}

function test2(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     arr.length = 0;
    
     return arr.length;
}

function test3(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     arr = new Array();
    
     return arr.length;
}

function test4(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     while( arr.length )
          arr.pop();
         
     return arr.length;
}

function test5(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     while( arr.length )
          arr.shift();
         
     return arr.length;
}

function test( $function: Function ): void
{
     var i: int = 1000000;
     var time: int = getTimer();
     while( i-- )
          $function();
    
     trace( getTimer() - time );
}

test( test1 );
test( test2 );
test( test3 );
test( test4 );
test( test5 );

결과값

1023
815
1596
1476
1991

당연하겠지만 shift가 가장 느리고 length = 0 이 가장 빨랐습니다.

여기서 초기에 공통적으로 생성해주는 부분이 약 700 ms 소모되므로 초기화하는 과정만 시간을 따로 떼어내면

323
115
896
776
1291

이라는 수치로 바뀝니다.

즉 [] 로 초기화 시키는 것 보다 length = 0 으로 해주는 것이 약 1/3 시간 밖에 걸리지 않습니다.

유후~

메모리도 많이 줄어들것이라고 예상합니다.

유후~



For the better
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 아~ 이게 빠르다고 속도가 민감한 부분에 꼭 저렇게 사용하라고 그러시더군요!
    ㅋㅋ 실제 테스트 수치를 보니 더 와닿네요
    수고하셨어요!

    2010/05/12 15:37 [ ADDR : EDIT/ DEL : REPLY ]
  2. 파퓨표

    오홍 ㅎㅎ 그렇군요 ㅎㅎㅎㅎ
    좋은 정보 감사염~ ㅋㅋㅋㅋ
    유후~ ㅋㅋ

    2010/05/12 15:42 [ ADDR : EDIT/ DEL : REPLY ]
  3. 앗.. 이거슨 플래시 서울 컨퍼런스때 나왔던 TIP 인거 같네요! ㅎㅎ

    2010/05/12 16:52 [ ADDR : EDIT/ DEL : REPLY ]
  4. 겨울나기

    For the better. 수고하셨습니다!

    2010/05/12 16:56 [ ADDR : EDIT/ DEL : REPLY ]
  5. 오호!! 좋은거 배워갑니다

    2010/05/13 10:00 [ ADDR : EDIT/ DEL : REPLY ]
  6. 쫑쫑쫑

    나이스횽 ㅋ ~ ㅋ

    2010/05/18 15:08 [ ADDR : EDIT/ DEL : REPLY ]
  7. 뱀뱀

    오호~ 한 수 배워 갑니다~

    2010/07/21 16:39 [ ADDR : EDIT/ DEL : REPLY ]

원문 : richinternet.blog



JDT에 있는 TODO, FIXME 는 정말 유용합니다.

Flash Builder에서도 사용할 수 있습니다.



1. 다음 플러그인을 다운 받습니다.

plugin : [ Download ]



2. 압축 파일을 열면 plugins 폴더 내에 *.jar 파일을

Flash Builder 설치 경로/plugins 폴더에 복사합니다.





3. Flash Builder를 재시작합니다.





4. Windows > Other Views > Task 창을 꺼냅니다.





5. 이제 TODO와 FIXME 키워드를 이용해서 태스크를 관리할 수 있습니다.



For the better.
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 쫑쫑쫑

    ㅋㅋㅋ 이거 그냥 되는 줄 알았는데 안됀다니 !!!! ㅋㅋ 유용하게 쓸게용 ㅋ ~

    2010/05/04 15:18 [ ADDR : EDIT/ DEL : REPLY ]
  2. 티오엠

    맨날 이거 해야지 하고서 까먹었는데 이걸 추가해 주는 플러그인이 있었네요. 잘쓸께요 ㅋ

    2010/05/04 16:45 [ ADDR : EDIT/ DEL : REPLY ]
  3. 허 원래 안되는거였군요, 이클립스, zend studio등 많이 쓰는지라 당연히 될꺼라고 생각하고 있었는데

    플랙스 하면서 날고쳐주오 해본적이 한번도 없었었나 ;;

    2010/05/06 21:51 [ ADDR : EDIT/ DEL : REPLY ]
  4. 어머! 너무 유용해요~~~ 요즘나오는 IDE는 이런거 기본인데... 플러그인을 설치하는게 불편해요~ ㅋㅋㅋ

    2010/05/10 19:55 [ ADDR : EDIT/ DEL : REPLY ]
  5. Blackiz

    뭐 이런걸다.. 굽신 굽신.

    2010/09/15 10:04 [ ADDR : EDIT/ DEL : REPLY ]

프로젝트를 진행하다보면 많은 심볼을 만들어서 사용하는데

CS4, CS5 에서는 라이브러리 아이템을 여러개 선택해서 속성을 바꿀 수 있는 기능이 있습니다.

한번 살펴보겠습니다.



여러 무비 클립을 잡고



Base class를 한번에 지정할 수 있습니다.



단, 무조건 다 똑같이 설정된다는 것이죠.

만약 패키지명만 바꾼다던가 숫자는 유지한 채 이름만 바꾼다거나 하는 일들은 불가능하죠.

게다가 CS3에서는 사용할 수 없습니다.

이번에 올리는 JSFL은

Class명과 Base class를 유연하게 Find & Replace할 수 있는 유틸입니다.

CS3 이상에서는 모두 사용할 수 있습니다.

게다가 무려 Regular Expression(정규표현식)을 지원합니다.

자 한번 예를 들어볼까요?



이런 클래스들이 쭈루룩 있습니다.

DigitType 이라는 이름을 바꾸고 싶네요...

ㄱㄱ



Class Name 을 바꾸는 커맨드를 실행합니다.



정규표현식으로 "DigitType"으로 시작하고 그 뒤에 오는 문자"."들 모두"*"를 괄호로 그룹핑 해줍니다.



CounterType으로 시작하고 앞에서 그룹핑해놓은 부분을 가져다가 대입합니다. (첫번째 괄호에서 찾은것이 1번 그 뒤로 2, 3, 4 번입니다.)



쨔잔~



위와 마찬가지로 Base class도 적용됩니다.

다만 Base class는 라이브러리창에서는 보이지 않으니까 확인이 필요하죠.

정규표현식을 사용하므로 조심히 다뤄야합니다.

하지만 Undo가 가능하니까

연습해보시면서 손에 익히시길 바랍니다.


JSFL 다운 받기 : [JSFL] Find & Replace.zip


:)


포스팅에 웃긴 사진을 그만 올려야겠습니다 ㅡ"ㅡ


저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 잉잉

    웃긴사진 잘 보고 갑니다.^^

    2010/03/25 17:11 [ ADDR : EDIT/ DEL : REPLY ]
  2. 음 JSFL이라는 것이 Flash CS4, 5에서만 사용되니??? 뭔가 Flash Builder 4에서도 동작하는 뭔가 없낭?

    2010/03/29 02:30 [ ADDR : EDIT/ DEL : REPLY ]

한글로 메세지를 보여줄 때 동적으로 메세지를 붙이죠.

이럴 때 "우야꼬"라는 메세지가 들어오면 "우야꼬는" 으로 해줘야하고

"김깐죽"이라는 메세지가 들어오면 "김깐죽은"으로 해줘야되는 "은, 는" 문제가 있습니다.

이럴 때 사용할 수 있는 유틸입니다.

사용법은 다음과 같습니다.

var result: String = MessageUtil.replace( 원문, 치환약어, 치환할 문자 );


import kr.as3.utils.MessageUtil;

const
HELLO_MESSAGE: String = "안녕, 난 $NAME|이라고,라고|해^^ \n날 $USER|으로,로| 불러주렴~";

var converted: String = HELLO_MESSAGE;
converted = MessageUtil.replace( converted, "$NAME", "박종희" );
converted = MessageUtil.replace( converted, "$USER", "김소심" );

// 안녕, 난 박종희라고해^^
// 날 김소심으로 불러주렴~


이름과 닉네임을 바꿔서 대입해보면

import kr.as3.utils.MessageUtil;

const
HELLO_MESSAGE: String = "안녕, 난 $NAME|이라고,라고|해^^ \n날 $USER|으로,로| 불러주렴~";

var converted: String = HELLO_MESSAGE;
converted = MessageUtil.replace( converted, "$NAME", "신진숙" );
converted = MessageUtil.replace( converted, "$USER", "파퓨표" );

// 안녕, 난 신진숙이라고해^^
// 날 파퓨표 불러주렴~

위처럼 단어에 알맞은 조사를 판단해서 붙여줍니다.

메세지 작성 방식은 이렇습니다.

메세지 중간에 치환할 텍스트 별명(alias)를 지정해주고

단어에 따라서 조사가 바뀌어야할 부분이 있다면 "|"로 시작해서 콤마(,)로 구분해서 "|"로 닫아줍니다.

즉 단순히 단어만 치환하고자 할 때는

"안녕 내 이름은 $NAME." -> 안녕 내 이름은 박종희.

조사가 붙어야하는 경우라면

"안녕, 난 $NAME|이라고,라고|해." -> 안녕, 난 우야꼬라고해.  or 안녕, 난 김소심이라고해.

라고 작성해주면 됩니다.



자 이제부터 사용자 친화적인 메세지를 전달해봅시다~!!


소스 다운 ㄱㄱ싱







편하죠?
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 결국 만드셨군요 ㅋㅋㅋㅋ

    2010/03/22 22:26 [ ADDR : EDIT/ DEL : REPLY ]
  2. 박종희 = 김소심 ?????? 으잉 ㅋ? 제 성까지 개명하시나요 ㅋ? 4pt 소문자 a형 형 흥 ㅋ

    2010/03/22 22:41 [ ADDR : EDIT/ DEL : REPLY ]
  3. 우와아앙. 형 이거 좋은데요? 근데 언제 써먹지... 써먹고 싶은데..

    2010/03/22 23:30 [ ADDR : EDIT/ DEL : REPLY ]
    • 아냐 서비스 하다보면 언젠간 반드시 필요할거야.
      국내서비스라면 필수지!!

      2010/03/23 11:17 [ ADDR : EDIT/ DEL ]
  4. 멋지네요~ 초성검색도 간단하게 될듯

    소스중에 21 하고 28 부분은 잘 모르겠군요 -ㅅ-;; 이거 유니코드에 대한 이해가 선행되야 할듯
    감사합니다~

    2010/03/23 10:28 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 초성검색도 divide나 merge메서드 사용하시면 되요.
      유니코드를 다 보실 필요는 없고
      이렇게 분리되는구나~하는 공식만 아시면 쉬우실거에요.
      다만 고려해야될게 한글이 조합형과 완성형이 있다는 거죠 쿨럭...

      2010/03/23 11:18 [ ADDR : EDIT/ DEL ]
  5. $str|case1, case2| 에서
    case1 에는 $str에 받침(종성)이 있을때,
    case2 에는 $str에 받침이 없을때 들어갈 문자열을
    순서대로 지정해줘야 하네요...
    생각도 못했는데 한글에 이런 규칙이 있다니...ㅎㅎ 재밋게봤어요 ^^

    2010/03/23 11:56 [ ADDR : EDIT/ DEL : REPLY ]
  6. 한때 텍스트 머드 게임에서는 필수 기능이었던.. ㅋㅋ

    2010/03/23 12:17 [ ADDR : EDIT/ DEL : REPLY ]
    • 와우 머드게임개발도 하셨나보네요
      덜덜 멋지십니다~

      2010/03/23 12:32 [ ADDR : EDIT/ DEL ]
    • 아뇨 ㅎㅎ 단지 머드 게임 중독이었어요 ㅎㅎ

      2010/03/23 13:54 [ ADDR : EDIT/ DEL ]
  7. 스핀

    오홍 희안한다 ㅋㅋ 멋진데 아꽁..!!

    2010/03/25 15:54 [ ADDR : EDIT/ DEL : REPLY ]
  8. 우연히

    검색 중 보게 되었는데, 정말 멋집니다.

    2010/09/26 08:32 [ ADDR : EDIT/ DEL : REPLY ]
  9. 따숩소

    편해요. ^^b

    2011/01/10 12:48 [ ADDR : EDIT/ DEL : REPLY ]

fla내에 산더미처럼 쌓여있는 이미지들을

원하는 폴더에 모두 뽑아주는 기능을 만들어봤습니다.



하... 많다...

저 많은 png 를 하나씩 밖으로 뽑으려면 엄청난 손이 가죠...

그래서 JSFL로 만들어봤습니다.

원본 JSFL 다운로드 : Export All PNG.jsfl (자동실행주의)

설치형 MXP 다운로드 : ExportAllPNG.mxp (설치법 참조 : Adobe Extension 제대로 설치하기)

사용하는 방법은 아래를 보시죠~



1. Commands > Export All PNG 를 선택합니다.





2. 폴더를 적으라고 나오는데요. 드라이브명부터 다 적어줍니다. (폴더는 미리 만들어둬야합니다.)

OK 클릭~





3. 쨔잔~



디자이너가 소스를 주지 않았다고해서

이제 불평할일은 없을거 같습니다.

보다 나은 개발자의 삶을 위하여~

록타~



관련글

 - 어도비 한국 사이트 JSFL 강좌 1부 : JSFL이란 무엇인가?
 - 어도비 한국 사이트 JSFL 강좌 2부 : 유용한 JSFL 만들기
 - 어도비 한국 사이트 JSFL 강좌 3부 : JSFL 확장, 배포하기
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 캄솨함니다!! ㅎㅎ

    2010/03/16 14:43 [ ADDR : EDIT/ DEL : REPLY ]
  2. 감사합니다!! 보다 나은 개발자의 삶에 큰 도움이 되겠어요!!

    2010/03/16 17:28 [ ADDR : EDIT/ DEL : REPLY ]
    • 그랬으면 좋겠어요 ㅠ.ㅠ
      앞으로도 종종 만들어서 올려야겠어영

      2010/03/22 10:09 [ ADDR : EDIT/ DEL ]
  3. 정말 형은 재간둥이야 !

    2010/03/18 16:08 [ ADDR : EDIT/ DEL : REPLY ]
  4. 아르모르

    와우!! 정말 유용한 기능...그저 감사하다는..이렇게 필요한걸 만들고 개선하는 능력과 의지..대단해요 많이 배우고있어요 ^^a

    2010/03/19 14:19 [ ADDR : EDIT/ DEL : REPLY ]
    • 개발자는 적당히 게을러야한다죠...
      게으름의 끝은 JSFL입니다 ㅋㅋㅋㅋ

      2010/03/22 10:09 [ ADDR : EDIT/ DEL ]
  5. 꿈공장장

    고마워이 ㅋㅋㅋㅋ 야꼬는 정말 재간둥이야!

    2010/07/26 11:30 [ ADDR : EDIT/ DEL : REPLY ]
  6. 미티어

    안녕하세요~ jsfl 공부하고 있는데요.. jsfl로 소스제작한것을 mxp로 패키지하여 배포를 할려고 하는데...
    mxi파일을 만들어야 되더라구요.. jsfl파일을 mxi파일로 어떻게 만들가요? 아무리 찾아봐도 잘 모르겠네요...컴포넌트가 어쩌고 하는데.. jsfl파일로 쉽게 mxi파일 만드는 방법은 없을가요?

    2010/08/30 15:27 [ ADDR : EDIT/ DEL : REPLY ]



스테이지에서 생성한 인스턴스들을 자동으로

멤버변수로 선언해주는 옵션입니다.

이 옵션은 반드시 끄고 사용하시길 바랍니다.

멤버변수로 사용하려면 반드시 public var 로 선언하시고 사용하시길 바랍니다.

수 많은 컴파일 에러와 런타임 에러를 동반하는 무서운 옵션입니다.

개발자가 편해지려고 꼼수 부리면 얼마나 사용자가 불편해지는지를 보여주는 단적인 예입니다.

이미 선언되어 있는 멤버변수를 뒤엎어서 컴파일하기 때문에

갖가지 컴파일 에러를 발생시킬 뿐더러

멤버변수를 상위 클래스로 상속할 수 없게 되는 무시무시한 단점이 있습니다.

그냥 결론은 하나입니다.

저 옵션을 끄자구요~ :)
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. neec

    전 생각이 다릅니다. Flash의 수많은 장점중 하나를 굳이 안써야 할까요.
    제시하신 문제는 네이밍 룰과 명명된 객체를 바라보는 시각의 차이로 해결할 수 있다고 생각됩니다.
    인스턴스 명은 수많은 객체들 사이에서 특정 객체를 위한 검색 키에 불과하지 맴버변수가 아닙니다. addChild()로 맴버변수가 늘어난다는 표현은 부적절 하다고 봅니다.

    명명된 객체를 제어하는 습관을 this.mc_one 과 같은 방식이 아닌 this.getChildByName을 이용해 유효성 검사를 해줘야 합니다.

    2010/03/04 10:53 [ ADDR : EDIT/ DEL : REPLY ]
    • 저도 그렇게 알고 있었는데
      클래스 파일에서 선언되어 있는 멤버 변수를 Flash가 컴파일할 때 엎어버린다는게 문제거든요.
      실제로 버그와도 이어지기 때문에 중요한거 같아요.

      2010/03/04 13:31 [ ADDR : EDIT/ DEL ]
  2. 믹네코이

    음 이옵션은 어디서 설정하는건가요? cs4에선 않보이는데요...?

    2010/03/24 14:49 [ ADDR : EDIT/ DEL : REPLY ]
    • Properties 창에서 우측에 ActionScript Settings에 들어가시면 있어요~

      2010/03/24 17:19 [ ADDR : EDIT/ DEL ]

곧 있으면 Flash Builder가 출시 될텐데

꼭 Flash Builder에 국한된 것은 아니고 Flex Builder 에서도 똑같이 활용할 수 있는 팁들일거에요.



1. 한 줄 통채로 지우기

Ctrl + D

생성자함수지만... Ctrl + D





현재 커서가 위치해있는 줄을 통채로 지워줍니다.

여러줄을 선택한 상태라면 다 지워주죠.

전 이 단축키 없으면 아무것도 못합니다. -_-

(그래서 xCode에 적응하지 못하는 것일 수도...)



2. 무조건 다음 줄 삽입하기

Shift + Enter

아무데나 있는데서 Shift + Enter



+ㅁ+ 오오오



현재 커서가 있는 줄의 다음을 만들어주면서 이동합니다.

보통은 커서를 현재 줄에서 제일 끝으로 이동시킨 다음에 엔터를 치죠.

이거 편해요 -_-)b



3. 클래스 찾아서 열기

Ctrl + Shift + T



프로젝트 덩치가 커질 경우 일일이 클래스 찾아 연다는게 보통 아니죠.

현재 열린 클래스에서 사용하고 있다면 Ctrl + Click 으로라도 열겠는데 그것도 아니라면

짜증이 이만 저만이 아니죠.

그럴때 클래스 이름으로 찾아서 열어줍니다.



4. 여러 줄 주석 달았다 지웠다 하기.

Ctrl + /

선택하시고~



Ctrl + /



한 줄 주석 다는걸로만 알고 계신분들이 많은데

여러줄을 선택한 상태에서는 여러 줄도 동시에 달아줘용~



5. 매크로 키워드 사용하기.

Use the force!!!!!!!



뜨든!!



LA MAX 2009 에서 시연하는 사람이

편집창에 "force"라고 입력한 다음에 "Use the force!! (스타트랙 대사인듯?)"라고 외치자

엄청난 코드가 한번에 나오는 것을 보고 엄청 신기해했습니다. +ㅁ+)!!



수소문 끝에 찾아보니 Snip Tree 라는 플러그인이더군요.

딴형 카페에서 쎄시아님께서 올려놓으신 글을 보고 알게 되었습니다.

(직접 링크 걸면 가입하라고 뜨기 때문에 네이버 검색 결과를 링크 걸어드릴께요 -_-a 첫번째 검색 결과에요)

링크 : http://search.naver.com/search.naver?where=nexearch&query=snip+tree&x=0&y=0&sm=top_hty&fbm=1



6. 주석 블록 쉽게 on/off 하기.

주석의 형태



/ 하나 지웠을 뿐인데...



이건 gSkinner 형님께서 블로그에 올린 내용입니다.

보통 여러줄을 블럭처리할 경우 /* */ 를 사용하는데 반복해서 닫았다 열었다 하려면 보통 노가다가 아니죠.

그래서 / 문자 하나만 지웠다 썼다하면서 주석 블럭을 전체를 닫았다 열었다 할 수 있는 팁입니다.



7. File Template 이용하기

Preference > Flash Builder > File Template



이건 Flash Builder 에서만 가능한 기능입니다.

내가 만드는 클래스나 인터페이스, 파일의 포맷을 미리 지정할 수 있습니다.

여러가지 변수를 사용할 수 있어서 정말 유용합니다.

특히나 Signature를 사용할 경우 최고죠 -_-)b



8. Flex Project이지만 Document Class를 *.as 로 지정하기

mxml 확장자를...



as로... 읭?



이거 모르시는 분들 굉장히 많습니다.

저는 Flex Builder 2 때부터 당연하게 쓰고 있었는데

플렉스 개발하시는 분들은 너무너무 놀라시더군요... @_@)!!!!!

저는 Flex Component를 전혀 사용하지 않기 때문에

AIR 프로젝트를 진행할 때는 이처럼 Document Class 형식으로 개발합니다.

후훗... 모르셨죠...? 인정하시죠... 으흐흐...



그럼 이만 공부하러 _(_ _)_

(아참 iPad SDK가 올라왔더군요...)
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 쫑쫑쫑

    우옹 ㅋ+_+ 쌘유요 ㅋ ! 그리고 추가로 asd Ctrl+X ASD 대문자로 바뀌어용 ~

    2010/01/30 14:47 [ ADDR : EDIT/ DEL : REPLY ]
  2. 크허허 좋은 정보 감사합니다.ㅎㅎ Flash Builder 는 언제쯤 정발할까요;;

    2010/01/30 15:05 [ ADDR : EDIT/ DEL : REPLY ]
    • 일단 cs5가 4월쯤 나오니까
      제품을 같이 출시한다면 그때 같이 나오겠지만
      그렇게출시한다면
      cs5, builder, catalyst 다 같이 나온다는 의민데
      아예 텀을 두고 하나씩 나오지않을까 시퍼

      4월에 cs5
      5월에 Flash Builder
      6월에 Catalyst
      머 이렇게

      2010/01/30 17:55 [ ADDR : EDIT/ DEL ]
  3. 저는 Flash Builder 보다 Xcode 가 더 편해지고 있네요. 본업을 뒤로한채 ㅎㅎ

    2010/01/30 15:52 [ ADDR : EDIT/ DEL : REPLY ]
    • 진정 부럽습니다
      맥북을 쓴지가 1년이 넘었는데도 버벅이는 저로썬
      그저 부러울 따름...

      2010/01/30 17:52 [ ADDR : EDIT/ DEL ]
  4. 티오엠

    으흐흐 감사합니다. 코딩할때 편하겠네요 ㅋ
    마지막 팁 덕분에 편하게 AIR어플리케이션을 만들 수 있겠네요.

    2010/01/30 19:26 [ ADDR : EDIT/ DEL : REPLY ]
  5. 소울

    우왕 감사합니다!!

    2010/01/31 01:09 [ ADDR : EDIT/ DEL : REPLY ]
  6. 마지막꺼 나.. 몰랐다는.. ㅋㅋ 인정...

    Code Hint 상에서 AD만 쳐도 ApplicationDomain이 나오는 것도 좋은 팁... 물론 이건 Eclipse공통이긴하지만.. ^^

    2010/02/01 03:41 [ ADDR : EDIT/ DEL : REPLY ]
  7. 난 crtl + shift + t보다 r이 좋더라 Eclipse 단축키는 plugin 형태일 때는 본 eslipse를 따라가게 되고 standalone일 때는 플렉스빌더에서 정의된 단축키를 따라가더라.. 가령 ctrl + shift + F는 이클립트에서 ctrl + H얌.. 또 eclipse에서는 ctrl + h는 여러 파일 검색을 지원해주는뎅.. flashbuilder에서는 ctrl + shift + f 파일 검색만 지원해준다는.. ctrl + o도 편하게 쓰는 기능중 하나얌.. 그리고 ctrl + 3은 대박이라능.. 해보셈.. 마지막꺼 이번 녹화하면서 넣을라고 했는데 빼야 겠다 ㅋ

    2010/02/02 22:03 [ ADDR : EDIT/ DEL : REPLY ]
    • Ctrl + 3 이거 왕건인데요? 마스터 검색 필드네요!!
      Mac의 QuickSilver 같은... 오오

      2010/02/03 03:28 [ ADDR : EDIT/ DEL ]
  8. 몰랐던게 너무 많은데? =ㅂ=;;;

    2010/02/03 03:09 [ ADDR : EDIT/ DEL : REPLY ]
  9. Ctrl+Shift+c 도 주석처리를 해줍니다.
    /* */ 형태의 주석을 토글해주죠

    2010/02/03 16:11 [ ADDR : EDIT/ DEL : REPLY ]
  10. 댓글까지 버릴게 하나도 없는 글이다..

    =====UnknownGrotesQ

    2010/02/24 10:26 [ ADDR : EDIT/ DEL : REPLY ]

JSFL 만들기 2회 강좌가 CreativeFreedom 사이트에 연재 되었습니다.


Adobe 한국 공식 사이트 기고

반복 작업은 이제 그만! 플래시 작업을 돕는 똑똑한 기술,
Adobe Flash JavaScript(JSFL)로 자동화 기능 만들기. 2탄


(안타깝지만 로그인이 필요합니다. _(_ _)_ )





저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 수고하셨어요 형~!
    작가 우야꼬 ㅋㅋ

    2010/01/20 19:32 [ ADDR : EDIT/ DEL : REPLY ]
  2. 좋은 글 감사합니다.
    대박이에요 +_+b

    2010/01/23 22:29 [ ADDR : EDIT/ DEL : REPLY ]
  3. 쫑쫑쫑

    뎃가이횽 수고했어요 ㅋ ~

    2010/01/30 14:58 [ ADDR : EDIT/ DEL : REPLY ]
  4. 실버벨

    JSFL 만들기 2회 강좌를 우야꼬님 블로그에 올려 주시면 감사^^ 지난번에 한번 요청을 드렸는데~

    CreativeFreedom 사이트에 연재 된 페이지는 페이지를 찾을 수가 없다고 나와요~~~~

    2010/06/30 16:11 [ ADDR : EDIT/ DEL : REPLY ]

어도비의 플러그인인 *.mxp를 사용하려면

설치가 되지 않는 분들이 많습니다.

*.mxp 파일은 무조건 Extension의 언어를 기준으로 설치되기 때문에

Flash를 영문판으로 쓴다고해도 OS가 영문판이 아니면 제대로 설치되지 않을 수 있습니다.

다음과 같은 과정을 설치해야만 제대로 Extension을 사용할 수 있습니다.


테스트 파일 : WooyaggoJSFL.mxp (바로 열지 마시고 꼭 다른 이름으로 저장하세요.)
(JSFL 연재 2부가 올라간 후에 테스트파일도 같이 활성화됩니다.)


*1. 현재 사용하는 Flash에서 [Help > Manage Extensions...] 메뉴를 선택해서 Extension Manager를 실행합니다.
 





2. Install 버튼을 선택합니다.





3. 설치할 *.mxp 파일을 찾아서 선택합니다.





4. 설치가 되었는지 확인합니다.





5. Flash로 돌아가서 설치된 Extension을 확인합니다.




사실 여기서 가장 중요한 부분은 Extension을 띄우는 방법입니다.

기본적으로 Extension을 실행하거나 *.mxp파일을 더블클릭하여 열면 현재 OS의 언어로 뜨기 때문에 Flash의 언어와 달라집니다.

때문에 Flash에서 [Help > Manage Extensions...]를 통해서 Extension Manager를 Flash의 언어와 같은 언어로 실행시키는 것이 중요합니다.

이렇게 설치하는 방법은 Photoshop이나 Dreamweaver의 Extension도 마찬가지이기 때문에 Extension을 사용하려는 분들은 꼭 기억해둬야겠습니다.


저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

Adobe 한국 공식 사이트 기고

반복 작업은 이제 그만! 플래시 개발자의 작업을 돕는 똑똑한 기술.
Adobe Flash JavaScript(JSFL)로 자동화 기능 만들기.


(안타깝지만 로그인이 필요합니다. _(_ _)_)
저작자 표시 비영리 변경 금지
Posted by 우야꼬 

댓글을 달아 주세요

  1. 잘읽었어.
    그런데 기술노트가 아니라 creativefreedom 에 올라간거네? 뭔가 생소하다.

    2010/01/05 13:34 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 기술문서는 다른 내용으로 올라갈거에요 이번달에^^;;
      여기는 한국 어도비 공식 사이트래요.
      (실은 저도 몰랐어요 ㅋ)

      2010/01/05 13:45 [ ADDR : EDIT/ DEL ]
  2. 어우 형 좋은데요~ 난 그냥 history저장하거나 깔짝깔짝 소스 고치기 정도만 했었었는데, 예제부터가 굉장히 유용해요, 좋은 정보 감사!

    2010/01/05 17:55 [ ADDR : EDIT/ DEL : REPLY ]
  3. 아 그리고 저는 cs3에서 햇는데 cs3에서도 잘 되네요

    2010/01/05 17:57 [ ADDR : EDIT/ DEL : REPLY ]
  4. 좋은 내용 잘 봤습니다.
    history 패널을 열어놓고 작업하면서 자주 하는 반복 작업들은 눈에 익혀야겠군요

    2010/01/05 18:10 [ ADDR : EDIT/ DEL : REPLY ]
    • 다음회차에서는 실제로 많이 쓰일 법한 예제들만 실을 생각이에요^^ 기대해주세용~

      2010/01/05 23:51 [ ADDR : EDIT/ DEL ]
  5. 형 고생하셨어요~ ㅎㅎ

    2010/01/05 18:14 [ ADDR : EDIT/ DEL : REPLY ]
  6. 예전에 flash 에서 템플릿 만드는 작업을 jsfl로 단순화 했더랬죠; 껀당 30분씩 걸리던걸 5분에 하나씩 할수 있게 되었습니다. (5분이라는 시간도 눈으로 확인하는 시간) 단순노동은 저리가라!!

    2010/01/05 18:50 [ ADDR : EDIT/ DEL : REPLY ]
  7. 좋은데요.. 특히 히스토리 패널이 정말 맘에 드는군요. JSFL이 그 막강한 기능에 비해 아직 비인기(?) 종목인건 확실한거 같네요... 연재글인거 같은데 좋은 가이드 부탁해요 ^^

    2010/01/06 17:15 [ ADDR : EDIT/ DEL : REPLY ]
    • 감사합니다^^ 다음 연재에서는 유용한거 많이 실릴테니까 꼭 봐주세용~

      2010/01/06 19:01 [ ADDR : EDIT/ DEL ]
  8. 금돌

    잘 보것습니다.~ ㅋㅋ

    2010/01/07 16:11 [ ADDR : EDIT/ DEL : REPLY ]
  9. 늦었지만, 30을 축하한다. ㅋㅋ;

    2010/01/08 00:16 [ ADDR : EDIT/ DEL : REPLY ]

자막 모듈을 만드는데 기왕이면 *.smi 파일 형식을 따르고 싶어서

만들어봤습니다.

private function trimTag( $str: String ): String
{
     var str: String = $str;
     str = str.replace( /\n/g, "" );
     str = str.replace( /\r/g, "" );
     str = str.replace( /[<][^>]*[>]/gi, "" );
    
     return str;
}

줄바꿈은 필요에 따라 없애고 사용하셔도 됩니다.

_(_ _)_
Posted by 우야꼬 

댓글을 달아 주세요

  1. 오오오

    2009/12/22 12:10 [ ADDR : EDIT/ DEL : REPLY ]
    • 왜 이래 정규표현식으로 HTML파싱 한번 안해본 사람처럼~

      2009/12/22 23:30 [ ADDR : EDIT/ DEL ]
  2. 나왔구나 암호문... 해독하고 싶으시면 욜로(http://www.gskinner.com/RegExr/RegExr.swf ) 가보세요~

    2009/12/22 15:32 [ ADDR : EDIT/ DEL : REPLY ]
    • 어이구... 스키너형님의 광팬인데 이런게 있는줄은 몰랐네요.
      어우;;; 괴물;;;
      좋은 정보 ㄱㅅ

      2009/12/22 23:31 [ ADDR : EDIT/ DEL ]
  3. | 로 연결해서 한번에 보내
    /\n|\r|[<][^>]*[>]/g

    작성한 정규식에 대소문 구분은 원래 없어서 괜히 i옵션을 줘서 더 느리게 만들 필요는 없구 ^^

    2009/12/22 22:20 [ ADDR : EDIT/ DEL : REPLY ]
    • 원래 \\r 랑 \\n랑 따로 구분해뒀다가 코드 올리느라 나눠놨는데
      일반 텍스트에서는 캐리지 리턴은 쓰일 일이 없어서 아예 나눠서 쓰거든요.
      여기서는 형님 말대로 합치는게 낫겠네요^^

      2009/12/22 23:29 [ ADDR : EDIT/ DEL ]
  4. 스니커즈

    AIR활성화에 큰 공헌을 하시는분 같아서 플래시 하는
    사람으로써 정말 존경스럽습니다.
    AIR어반젤리스트 다운 포스트가 상당히 많내욤
    좋은 정보 고맙습니다.

    2009/12/23 07:25 [ ADDR : EDIT/ DEL : REPLY ]
    • 아이고 너무 과찬을...
      (솔직히 에어가 활성화는 안됐죠 ㅋㅋ)
      나중에 모임같은데서 뵈면 아는척해주세요~
      요즘 글 잘 못올리고 있는데 많이 올릴께요^^
      감사합니당~

      2009/12/24 02:28 [ ADDR : EDIT/ DEL ]
  5. 근데..생각해보니 \r \n을 구지 지워야해?
    오히려 /[<]br\S+[/]*[>]/ 를 \r 이나 \n으로 바꿔야하는거 아닌가..^^;

    2009/12/23 14:42 [ ADDR : EDIT/ DEL : REPLY ]
  6. 정규식 싫어효.ㄷㄷㄷ

    2009/12/23 23:37 [ ADDR : EDIT/ DEL : REPLY ]

이미지 파일을 추가하려고

이미지를 드래그해서 Stage에 끌어다 놓거나

Ctrl + R 을 누르면 뜨는 XXX






장난아니죠 -_-+

드디어 해결방법을 알아냈습니다.

뜨든!!









exe 파일을 우클릭하셔서 "속성" > "호환성" > "호환모드" > "Windows 2000"을 선택해주시면 됩니다.





그리고 실행...

에러가 안날겁니다.


























커흑.......... !!!
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 
TAG cs4, flash, import

댓글을 달아 주세요

  1. 먼가 야매스러 -_-;;

    2009/11/03 18:18 [ ADDR : EDIT/ DEL : REPLY ]
  2. ㅎㅎ 저두 저거 많이 봤는데...
    윤폰트 같은걸루
    텍스트 툴바에서 font가 그 윤폰트 (플래시에서 자주 에러나는 폰트 ) 같은걸루 설정되있으면 저렇게 되던데요..
    그래서 폰트를 바꾸었더니
    100%는 아니구 저는 그런식으로 하니깐 에러 막나다가 안내더라구요..

    2009/11/04 10:23 [ ADDR : EDIT/ DEL : REPLY ]
    • 너 내 사이트 보기는 하는구나 ㅋㅋㅋ
      윤폰트 문제라기보다는 폰트명이 클래스명으로 될 수 없는 이름일때 나는 에러라고 하는게 더 정확할거얌

      2009/11/16 01:53 [ ADDR : EDIT/ DEL ]
  3. 쫑쫑쫑

    아잉 ㅋ ~ 난 뭔소린가했넴 ;

    2009/11/04 10:35 [ ADDR : EDIT/ DEL : REPLY ]
  4. 잉잉

    쩝...ㅎ

    2009/11/04 13:33 [ ADDR : EDIT/ DEL : REPLY ]
  5. 음 비스타인가...
    나랑은 관계 없군 ㅋㅋㅋ
    플래시 개발자라면 플래시의 잦은 다운에 익숙해 지면서,
    Ctrl+S, Ctrl+Enter 콤보를 몸에 익혀 불의의 사고에 대비하는 수밖에...

    2009/11/04 17:37 [ ADDR : EDIT/ DEL : REPLY ]
  6. 파퓨표

    ㅋㅋㅋ난... 저 에러창... 참 많이 봤지.... ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

    2009/11/07 00:13 [ ADDR : EDIT/ DEL : REPLY ]
  7. 키노코

    커흑! 저도 이것때문에 골치였는데 너무 감사합니다.

    2009/11/13 10:46 [ ADDR : EDIT/ DEL : REPLY ]
    • 그러게요 은근히 속 썩는 분들이 많을거 같아서 옮겨봤습니다 ㅠ.ㅠ

      2009/11/16 01:54 [ ADDR : EDIT/ DEL ]
  8. 나나

    안되는디 ㅜㅜㅜㅜㅜ 이렇게 했는데도 안되면 어떻게 해여?
    adobexmp.dll 파일이 없다면서 이렇게 오류가 나는데/;;

    2009/11/17 09:08 [ ADDR : EDIT/ DEL : REPLY ]
  9. 금돌

    ㅋㅋ 마지막 사진 멋지네여 ㅋㅋ

    2009/11/25 16:12 [ ADDR : EDIT/ DEL : REPLY ]
  10. 미리내

    그래도 오류가 나는 사람은 어찌하나요..ㅠㅠ

    2009/11/26 00:23 [ ADDR : EDIT/ DEL : REPLY ]
  11. 흘러흘러 나그네

    아오!! 너무 감사합니다!! @.@
    정말 저 소지섭!! 남일같지 않아요!!! ㅎㅎㅎㅎㅎㅎㅎㅎㅎ 지금 내모습!

    2009/12/03 19:14 [ ADDR : EDIT/ DEL : REPLY ]
  12. 휴휴

    드뎌 해결되는가 싶더니..
    호환성 바꾼이후로 그냥 플래시가 실행이 안되네요 ㅠㅠ 왜그럴까요 ㅠㅠ

    2010/02/15 23:35 [ ADDR : EDIT/ DEL : REPLY ]
  13. 굳!!

    감사합니다~드디어 라이브러리에 파일을 불러올수 잇다는 ㅠㅠ 감격스러워라~

    2010/02/26 01:14 [ ADDR : EDIT/ DEL : REPLY ]
  14. 질문ㅠㅠ

    저도 이거때문에 엄청 속써이고 있었는데 말씀하시는 exe파일이 무엇인지 자세히 설명해 주실 수 없나요ㅠㅠ 급한데 ㅠㅠ

    2010/03/16 19:21 [ ADDR : EDIT/ DEL : REPLY ]
    • 질문한사람ㅋㅋ

      와.......됬어요!! 감사합니다 ㅠㅠㅠㅠㅠㅠㅠ 진짜 완전 속 썩고있었던건데 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

      2010/03/16 19:29 [ ADDR : EDIT/ DEL ]
    • 다행이네요^^
      저도 엄청 고생했었거든여^^

      2010/03/18 15:16 [ ADDR : EDIT/ DEL ]
  15. 윈디짱

    와 완전감사감사. 최근 이문제로 완전 돌아버리기 일보직전이었는데. 감사*백만번입니다!!!

    2010/04/29 10:52 [ ADDR : EDIT/ DEL : REPLY ]
  16. woody

    우야꼬님 쵝오~~!!

    2010/04/29 23:04 [ ADDR : EDIT/ DEL : REPLY ]
  17. 와우

    감사해요ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

    2010/06/01 23:51 [ ADDR : EDIT/ DEL : REPLY ]
  18. 밀뽕

    와.. 대단하십니다~ 요고땀시 진도 못나가구 있었는데.. 괜한 CS4 새로 설치하고.. 폰트 지우고 쌩 난리 부르스를 쳤지모에요~ 아무튼 님왕짱!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    2010/06/03 15:20 [ ADDR : EDIT/ DEL : REPLY ]
  19. 우와!!!!!

    감사합니다~ 이것때문에 플래시를 몇번이나 깔았다 지웠다 했는지.. ㅠㅠ 정말 감사드려요~~!!

    2010/07/26 19:37 [ ADDR : EDIT/ DEL : REPLY ]
  20. storyline

    n_n 완전 감사합니다~!!!!

    2010/07/28 18:55 [ ADDR : EDIT/ DEL : REPLY ]
  21. 이슬

    정말 감사해요~~~~~~~
    왜이러나 했는데~~~~
    감사합니다^^*

    2010/08/10 11:02 [ ADDR : EDIT/ DEL : REPLY ]
  22. ㅇㅇ

    호환성을 바꾸니까 플래시 실행이 되다가 안되는데.. 어떡해야하나요..

    2010/08/11 23:11 [ ADDR : EDIT/ DEL : REPLY ]
  23. soo

    B_B) 완젼 감사드려요~~ ㅠㅠ 이거때문에 정말 고생 많이 했었는데요.. 좋은 정보 고맙습니당.. ㅠㅠ)/

    2010/09/03 15:20 [ ADDR : EDIT/ DEL : REPLY ]
  24. 미란다

    우하하하~ 완죤 감사!!감사!!
    저는 위 경고창도 없이 죽어버리는 현상이었는데 혹시나 해서 위 방법으로 해봤는데 성공했습니다.
    참고로 win7 64b, CS4 32비트 쓰고 있음.

    2010/09/14 12:04 [ ADDR : EDIT/ DEL : REPLY ]
  25. SABAHA

    이것 때문에 속터져서 뒤집혀질뻔 했는데 .......... ;;;
    감사합니다. ^^

    2010/09/15 16:10 [ ADDR : EDIT/ DEL : REPLY ]
  26. 또 다른 해결책

    호환성 바꾸고도 안되시는 분 킥타임 설치하세요. 그럼 됩니다!

    2010/09/28 07:44 [ ADDR : EDIT/ DEL : REPLY ]
  27. 서돼지

    휴~ ㅠㅠ 다행 3일동안 개고생 고민햇네

    2010/10/01 23:07 [ ADDR : EDIT/ DEL : REPLY ]
  28. 죽은벌레

    오오 감사합니다 ㅠㅠ 다시깔고 날리쳤는데 제길

    2010/10/14 15:01 [ ADDR : EDIT/ DEL : REPLY ]
  29. 오우~
    정말 감사드립니다...
    이것땜시 거품물로 돌아가실 뻔했는데...
    정말 한방에 해결되네요....
    복받으실꺼예요~ ^^b

    2010/10/25 17:56 [ ADDR : EDIT/ DEL : REPLY ]
  30. 피카

    감사합니다. 덕분에 해결하네요.

    2010/11/10 17:24 [ ADDR : EDIT/ DEL : REPLY ]
  31. 시르바

    아 ㅠㅠㅠㅠㅠㅠㅠ 진짜 복받으실거예요 ㅠㅠㅠㅠㅠ

    2010/11/29 13:03 [ ADDR : EDIT/ DEL : REPLY ]
  32. 카이

    덕분에 잘 해결하였습니다.
    감사, 감사, 감사합니다~*

    2010/12/01 15:17 [ ADDR : EDIT/ DEL : REPLY ]
  33. 송충이

    아 너무 감사합니다
    계속 꺼져서 프로그램을 지웠다 깔았다를 연속했는데
    감사합니다 ㅠ

    2010/12/10 12:05 [ ADDR : EDIT/ DEL : REPLY ]
  34. 포...포풍..!!

    너무 감사합니다............ㅠ_ㅠ

    2010/12/16 16:11 [ ADDR : EDIT/ DEL : REPLY ]
  35. 커흑!

    감사해여. 이젠 눈물 닦고 작업할랍니다. ^^)=b

    2010/12/30 14:37 [ ADDR : EDIT/ DEL : REPLY ]
  36. 덕분에 해결했네요; 감사합니다...

    2011/01/03 10:00 [ ADDR : EDIT/ DEL : REPLY ]
  37. ddd

    대박이네.. cs3 에서도 됩니다..ㅋㅋㅋㅋㅋ

    2011/01/18 16:50 [ ADDR : EDIT/ DEL : REPLY ]
  38. philip

    몇일동안 해결방법을 찾아 지식인을 허우적대다가 겨우 해결했습니다.
    감사합니다~ ^^*

    2011/02/11 14:32 [ ADDR : EDIT/ DEL : REPLY ]
  39. 와우

    진짜 감사합니다. 이것저것 쑤셔보다 속만 뒤집어졌어요ㅜ.ㅜ 이렇게 간단한걸..역시 블로그의 정보ㅎㅎ

    2011/02/14 22:33 [ ADDR : EDIT/ DEL : REPLY ]
  40. dsf

    와씨 님 완전 사랑해요ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

    2011/02/18 20:20 [ ADDR : EDIT/ DEL : REPLY ]
  41. 정말 감사합니다!! ㅠㅠ

    2011/03/07 14:35 [ ADDR : EDIT/ DEL : REPLY ]
  42. 우히히

    감사합니다 ~ 엄청 속썩고 있었는데 ;;

    2011/04/25 12:05 [ ADDR : EDIT/ DEL : REPLY ]
  43. 유비

    됩니다! 대단하심다!

    2011/04/26 07:30 [ ADDR : EDIT/ DEL : REPLY ]
  44. 냠냠

    정말 최고예요!! 감사합니다 ㅠㅠ

    2011/04/26 18:23 [ ADDR : EDIT/ DEL : REPLY ]
  45. 드리머

    감사합니다!! 하루종일 헤맸는데^^ 도움얻어갑니다

    2011/05/13 11:27 [ ADDR : EDIT/ DEL : REPLY ]
  46. 캣토

    검색하다 들렀습니다 오류나서 울고 있었는데.. 큰도움 받고 갑니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 감사합니다!!!

    2011/05/18 16:22 [ ADDR : EDIT/ DEL : REPLY ]
  47. ㅎㅎ

    헐 ㅈ솔직히속는셈치고 해본건데!!!!!!!!!!!!!!! 헐 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ감사해요

    2011/10/09 15:17 [ ADDR : EDIT/ DEL : REPLY ]
  48. 헐.... 최고 감사합니다 ㅠ0ㅠ 계속 안되서... 컴터가 용량을 감당못하고 자꾸 이러나 싶었는데 헐.... 감사합니다 ㅠㅠ

    2011/11/19 01:13 [ ADDR : EDIT/ DEL : REPLY ]
  49. 미니민트

    넘 감사해요...~

    2011/12/09 09:23 [ ADDR : EDIT/ DEL : REPLY ]
  50. 언데드

    매번 문제가 생기면 우야꼬님의 도움을 받게 되네요.
    정말 감사합니다. ^^

    2011/12/29 19:01 [ ADDR : EDIT/ DEL : REPLY ]

0~1 사이의 값만을 유지해야 한다면 보통은 다음과 같이 사용합니다.

function b( $b: Number ): Number
{
     if( $b < 0 )
          $b = 0;

     if( $b > 1 )
          $b = 1;
    
     return $b;
}

글쵸?

0보다 작다면 0을

1보다 크다면 1을 대입해서 사용하는 것이죠.

근데 저는 기능에 비해서 코드가 너무 길어서 저는 아래와 같이 삼항식을 사용합니다.

function a( $a: Number ): Number
{
     $a = $a < 0 ? 0 : $a > 1 ? 1 : $a;
    
     return $a;
}

좀 Geek스럽지만 소스가 한줄로 줄여지니 다른 코드 사이에서 쓰일수도 있어서

자주 애용합니다.

아래는 퍼포먼스 테스트입니다. 과연 결

function a( $a: Number ): Number
{
     $a = $a < 0 ? 0 : $a > 1 ? 1 : $a;
    
     return $a;
}
function b( $b: Number ): Number
{
     if( $b < 0 )
          $b = 0;
    
     if( $b > 1 )
          $b = 1;
   
     return $b;
}
function c( $c: Number ): Number
{
     $c = Math.min( Math.max( $c, 0 ), 1 );
    
     return $c
}

// make test sample for using same to both
var i: int = 0xFFFFFF;
var arr: Array = [];
while( i-- )
{
     arr.push( Math.random() * 3 - 1 ); // -1~2
}

// test a()
i = 0xFFFFFF;

var time: int = getTimer();

while( i-- )
{
     a( arr[ i ] );
}

trace( getTimer() - time );

// test b()
i = 0xFFFFFF
time = getTimer();
while( i-- )
{
     b( arr[ i ] );
}

trace( getTimer() - time );

// test b()
i = 0xFFFFFF

time = getTimer();

while( i-- )
{
     c( arr[ i ] );
}
trace( getTimer() - time );


각 a(), b(), c() 의 테스트 결과는 다음과 같습니다.

a - 1751

b - 1684

c - 4894 (역시 기대를 져버리지 않는 Math)

오... 생각보다 느리지 않습니다.

(참고로 if + if 나 if + else 나 비슷비슷합니다)

애용하는데 있어서 확신이 생겼네요 ㅋㅋㅋ










































Math... 어쩔꺼야...
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 겨울나기

    원래 Math가 성능이 딸리나요?ㄷㄷㄷ;
    저렇게까지 차이난다면 약간 문제가 있을수도 있다고 생각이 드는데 말인데요..ㅋㅋ

    2009/10/22 16:42 [ ADDR : EDIT/ DEL : REPLY ]
    • Math는 느리기로 유명하죠.
      그래도 대부분 자주쓰는 값들은 const로 미리 계산해놓고 가져다 쓰는게 편하죠.

      2009/11/16 01:58 [ ADDR : EDIT/ DEL ]
  2. 삼항연산자를 두번 연달아 쓰기도 하는군요; ㅎㅎ

    2009/10/26 09:27 [ ADDR : EDIT/ DEL : REPLY ]
  3. 메쓰 드럽게 느림 ㅠ.,ㅠ

    2009/10/28 00:50 [ ADDR : EDIT/ DEL : REPLY ]
  4. 무식한 Math... ㅋ
    누가 만들었을까. ㅋ

    2009/10/29 13:07 [ ADDR : EDIT/ DEL : REPLY ]
    • 머 어쩌겠샤 분야보다 범용을 위해서 만든건데 그럴수 밖에...
      (가끔 help보면 오타도 많더라... 얼마나 고생하면서 만들었을까... 커흑)

      2009/11/16 01:59 [ ADDR : EDIT/ DEL ]
  5. 편리함에는 그만한 대가가 따르는 법이지 ㅋ

    2009/11/02 17:43 [ ADDR : EDIT/ DEL : REPLY ]
  6. 금돌

    ㅋㅋㅋ

    2009/11/25 16:13 [ ADDR : EDIT/ DEL : REPLY ]

PFG에 인간 페로몬 니케가 PFG 3기 9회차에서 발표한 인터페이스에 대한 강좌입니다.

총 2강으로 되어있고 적절한 예제와 그림으로 설명되어 있습니다.

저도 추후에 한차례 강좌를 올리겠지만

ActionScript로 된 인터페이스 강좌가 많지 않기 때문에

많은 분들에게 도움되시라고 올립니다. ㅇ_ㅇ)/


Interface 활용하기 1/2

Interface 활용하기 2/2

Interface 활용하기 예제 다운로드























잘했다 니케!!

저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 
TAG as3, Interface

댓글을 달아 주세요

  1. ㅋㅋ 감사해요 형!
    근데 또 왠 페로몬!!!

    2009/09/13 20:30 [ ADDR : EDIT/ DEL : REPLY ]
  2. 쫑쫑쫑

    ㅋㅋㅋㅋ ㅋ 센스쟁이 ㅋ~ ~

    2009/09/16 00:35 [ ADDR : EDIT/ DEL : REPLY ]





유명해질대로 유명해진 커버플로우를

3D 프레임웍을 쓰지 않고 rotationY와 z 만으로 만들고 있습니다.

완성은 아니지만 모션이 다되서 함 올려봅니당 ^0^

Flash API만으로도 이정도 퀄리티가 나온다는걸 증명해보고 싶었습니다 T^T (오기죠 오기 ㅋㅋ)

깔끔해요 깔끔해~ 만족만족 s( ̄▽ ̄)z

원래 960 사이즈라 줄여놓으니 보기 흉스럽네요.

p.s) 여러개가 한번에 넘어갈때 꼴보기 싫어서 죽갔슴다 -_-+
저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 
TAG Coverflow

댓글을 달아 주세요

  1. 와우~! 형 멋져요
    저도 전에 PV3D로 만들어 본게 있긴한데 플래시 API만으로 한번 다시 만들어 봐야하겠어요~

    2009/05/17 20:12 [ ADDR : EDIT/ DEL : REPLY ]
  2. Flash Player 10이 제대로 잘 보급된다면 아주 좋은 툴이 될 수 있겠네요.
    효과 멋쩌요~

    2009/05/18 09:53 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 똑같이 PV3로도 만들어서 비교해보고 싶은데
      그냥 체감상으로도 약간 나은거 같아요^^

      2009/05/18 14:52 [ ADDR : EDIT/ DEL ]
  3. 좋은데? ㅎ

    2009/05/18 12:44 [ ADDR : EDIT/ DEL : REPLY ]
  4. 파퓨표

    우오오오~ ㅋㅋㅋㅋㅋㅋㅋㅋ

    2009/05/18 13:27 [ ADDR : EDIT/ DEL : REPLY ]
  5. 멋지당.. 근데 이미지 200개정도 해도 괜찮아?

    2009/05/19 11:01 [ ADDR : EDIT/ DEL : REPLY ]

ByteArray 타입의 바이너리 데이터를

웹에서 사용할 수 있는 문자열로 변환해줍니다.

아래의 1번 예제는

1. 유저의 이미지를 불러와 Bitmap.draw() 로 찍은 후에

2. JPEncoder 를 통해서 ByteArray로 인코딩을 합니다.

3. 이렇게 인코딩된 ByteArray를 텍스트로 변환합니다.

4. 텍스트를 클립보드로 복사합니다. (ctrl + c)

2번 예제는

1. 입력된(ctrl + v ) 텍스트를 읽어와서

2. ByteArray로 다시 변환합니다.

3. 이렇게 변환된 ByteArray를 다시 Loader를 이용해서 이미지로 로드해옵니다.



1) Binary -> Text



2) Text -> Binary



사용법은 간단합니다.

ByteArray를 텍스트로 변환하려면

var text: String = new StringSerializer().serialize( byte );

텍스트를 ByteArray로 다시 변환하려면

var byte: ByteArray = new StringSerializer().unserialize( text );

이렇게 사용하면 됩니당.

에러가 간혹 있을 수도 있습니다. 에러같은거 보이시면 바로 댓글 ㄱㄱ


StringSerializer.as



데이터의 증감률은 테스트해보니 아래처럼 나왔습니다.

13,624 byte 가 17,313(34,626 byte)의 문자로 변환 약 254% 증가.

10,862 byte 가 13,293(26,586 byte)의 문자열로 변환 약 248% 증가.

대략 2.5배 정도 용량이 늘어나더군요.

64개의 문자를 가지고 6 bit 단위로 치환하는 방식이기 때문에 모두 웹에서 표현할 수 있는 문자열입니다.

그리고 Preset 도 지정할 수 있어서 활용하기 좋을거 같습니다.

잇힝~

p.s) XML에 이미지가 들어가는 티스토리의 백업기능을 보고 흉내내봤습니다.


저작자 표시 비영리 동일 조건 변경 허락
Posted by 우야꼬 

댓글을 달아 주세요

  1. 오호~ 멋진데요 형! ㅎㅎ
    티스토리의 백업 기능이 이런거군요!

    2009/04/03 09:07 [ ADDR : EDIT/ DEL : REPLY ]
  2. 오홍. 멋진데요 ㅎ

    2009/04/03 10:06 [ ADDR : EDIT/ DEL : REPLY ]
    • 이힛~ 코드가 깔끔치 않아서 찝찝하긴 한데
      나름 쓸 방도가 많을거 같아서 공개해봤어용~

      2009/04/04 00:37 [ ADDR : EDIT/ DEL ]
  3. 오옷...정말 멋지네요...
    잘보고 갑니다...

    with okgosu (-..-)a

    ps. 위에 검쉰님 방가~

    2009/04/03 14:37 [ ADDR : EDIT/ DEL : REPLY ]
    • 헤헤 이미 남들이 해놓은거지만
      내 손으로도 만들어봤다~ 라는 성취감이 좋았어용^^
      또 이쁜거 만들어서 올려볼께용~

      2009/04/04 00:38 [ ADDR : EDIT/ DEL ]
  4. 우히히 +_+ b 역시 햇님은 킹왕짱이에요 ;; 저는 쉬프트 연산자만 봐도 정신이 혼미해지는데 ㅠ.,ㅠ

    2009/04/04 01:34 [ ADDR : EDIT/ DEL : REPLY ]
    • 햇님 ㅋㅋㅋㅋ 그단어 웃긴거 같어 ㅋㅋㅋㅋㅋ

      2009/04/07 23:12 [ ADDR : EDIT/ DEL ]
  5. 오홍홍~~ 멋져부려~

    2009/04/04 09:18 [ ADDR : EDIT/ DEL : REPLY ]
    • 아 빨리 형이 한거 보러가야데는데
      가면 보여주는거져??

      2009/04/07 23:12 [ ADDR : EDIT/ DEL ]
  6. 오오 멋져욤.+_+

    2009/04/05 15:18 [ ADDR : EDIT/ DEL : REPLY ]
  7. 멋지시네용~

    2009/04/07 00:01 [ ADDR : EDIT/ DEL : REPLY ]
  8. 난 Flash flatform에서 모든 데이터의 입출력은 ByteArray로 하고 싶은 1人 인데 ^^
    우야꼬가 한번 해봥~ :)
    멋지다! 근데 짤방이 없어?

    2009/04/07 19:04 [ ADDR : EDIT/ DEL : REPLY ]
    • 괜춘한데요?
      시간나면 한번 큰그림 그려봐야겠어요.
      짤방은 맨날 나가면 식상하자나요 ㅋㅋ
      다음 짤방을 기대해주셈~

      2009/04/07 23:14 [ ADDR : EDIT/ DEL ]
  9. 저걸 디비에 때려 넣으면 서버 터지겠군 ㅋㅋㅋ

    2009/04/09 20:01 [ ADDR : EDIT/ DEL : REPLY ]
  10. 야매코더

    우야꼬님 그때 컨퍼런스에서 보여주셨던 이미지 리사이져 도 위와 같은원리로 제작하신건가요 ?

    2009/04/21 14:23 [ ADDR : EDIT/ DEL : REPLY ]
    • 아니요 그것과는 다른거에요.
      비트맵 찍는건 마찬가지지만 여기서 나온 코드는 별개이지요~

      2009/04/22 16:01 [ ADDR : EDIT/ DEL ]
  11. andwhy

    오옷...안와본 사이에 신기한글들이 늘었구나~~~
    저거 비트맵데이터 말고도 다 사용할수 있는거네...+_+ 딱히 어따쓸수있을지는 모르겠지만...
    잘생각해보면 쓸수 있는게 많을것같다~~~+_+

    근데 비트맵데이터 보니까 예전에 알바할때..어떤 외국분이...(flash8시절..) 이미지를 픽셀단위로 색상정보를 '0xff00ff'식으로 텍스트를 쫘라락 만들어서 서버에 올려놓게 만든소스가 생각난다;;;ㄷㄷㄷ
    한 30*30 이미지였나??작은거였는데 서버데이터 용량이 4M이상이였던거 같은...;;;

    2009/05/12 17:27 [ ADDR : EDIT/ DEL : REPLY ]
    • 관심이 식은거야~? 그런거야~?
      그나마 가장 원본 용량에 비슷해지는 택틱이 아닌가 싶어

      2009/05/17 02:47 [ ADDR : EDIT/ DEL ]
  12. 매우 유익한 글이예요~~~~ ^^

    2009/05/17 01:55 [ ADDR : EDIT/ DEL : REPLY ]
  13. 이게 범용적으로도 사용할 수 있군.
    var a:String = "안녕하세요. 1234 ABCD 看样子他不会回来了。";
    var byte:ByteArray = new ByteArray;
    byte.writeUTFBytes(a);
    var s:String = StringSerializer.serialize(byte,true);
    trace( s );
    byte = StringSerializer.unserialize(s,true);
    trace( byte.readUTFBytes( byte.length ) );
    결과
    z5cAe38hg4vKif3W2a5Qio3KEW3KBazC1Z6=Lczee8GcE=35+fvB1yvHyG3PUaWPCw5PqoWHDMWBlR5P-rW3V1sEi=fEV
    안녕하세요. 1234 ABCD 看样子他不会回来了。

    27byte가 93byte가 된다. 하지만 String은 아무 쓸데없지...
    대신 이런건 어떨까?

    var id1:int = 1234;
    var id2:int = 9441991;
    var pos1:Number = 216.73013333;
    var pos2:Number = -83.66788611;
    var mag:Number = 4.31;
    var byte:ByteArray = new ByteArray;
    byte.writeInt(id1);
    byte.writeInt(id2);
    byte.writeDouble(pos1);
    byte.writeDouble(pos2);
    byte.writeDouble(mag);
    var s:String = StringSerializer.serialize(byte,true);
    trace( s );
    byte = StringSerializer.unserialize(s,true);
    id1 = byte.readInt();
    id2 = byte.readInt();
    pos1 = byte.readDouble();
    pos2 = byte.readDouble();
    mag = byte.readDouble();
    trace( id1, id2, pos1, pos2, mag );

    결과
    z5cRwngzO0hee-_rhyMfxN-Xhi1lzTWIDobwL9=31D+Yf-IKQVZDEhHNV
    1234 9441991 216.73013333 -83.66788611 4.31

    전체 32byte가 57byte가 되는군
    xml이나 db에 바로 넣게되는데 String만큼 쉬운것도 없긴 한데...
    크기가 커진다는 부담감이 없지않아 있네...

    뭔가 ByteArray값을 저장하는데 있어서 위와 같은 형태 말고 다른 방법이 없을까?

    2010/04/23 12:34 [ ADDR : EDIT/ DEL : REPLY ]
    • 와 괜찮은데요?
      타입별로 체크해서 불필요한 공간을 없애주는 거군요.
      크~ 죽이네요
      근데 하나 걸리는게
      저렇게 되면 어떤 타입들이 들어가는지 헤더가 들어가야할거 같아요. 그용량만 무시할정도가 되면 좋을거 같네요.
      아무래도 헤더크기-헤더내용-본문 이런식이 될텐데
      역시 혼자보다 여럿이서 코드를 주고 받으니 점점 좋아지네요^^
      형 짱~

      2010/04/23 14:25 [ ADDR : EDIT/ DEL ]
  14. 아래 코드로 하면 1byte단위로 데이타를 String으로 변경할 수 있기 때문에 기본적으로 용량차이는 전혀 나지 않을듯..


    class Sbyte{

    static private var base:uint = 128;
    static private var encode:String = '!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij';

    /**
    * ByteArray값을 String으로 변경
    * @param $byte
    * @return
    */
    static public function byteToString( $byte:ByteArray ):String{
    var result:String, i:uint, j:uint, position:int;
    position = $byte.position;
    $byte.position = 0;
    result = '';
    for( i = 0, j = $byte.length; i < j ; ++i ){
    result += encode.charAt( $byte.readByte() + base );
    }
    $byte.position = position;
    return result;
    }

    /**
    * String값을 ByteArray값으로 변경
    * @param $String
    * @return
    */
    static public function stringToByte( $String:String ):ByteArray{
    var result:ByteArray, i:uint, j:uint;
    result = new ByteArray;
    for( i = 0, j = $String.length; i < j ; ++i ){
    result.writeByte( encode.indexOf( $String.charAt( i ) ) - base );
    }
    result.position = 0;
    return result;
    }
    }


    아래처럼 사용하면 안됨
    trace( Sbytes.byteToString( Sbyte.stringToByte( “안녕하세요. 지돌스타입니다.” )) ); //bbbbb.bbbbbbbb.
    trace( Sbytes.byteToString( Sbyte.stringToByte( “Hello World!” )) ); //HellobWorld!


    반드시 ByteArray로 사용하면 잘된다. ^^

    출처 : http://www.diebuster.com/?p=1149

    2010/04/23 14:55 [ ADDR : EDIT/ DEL : REPLY ]
  15. 이와 관련되어 트랙백 달고강~

    2010/04/27 11:32 [ ADDR : EDIT/ DEL : REPLY ]
  16. 와 멋진데요. ~b
    트래픽에 대한 이슈만 없다면 다용도로 사용될수 있겠는데요 ~

    2012/02/02 12:22 [ ADDR : EDIT/ DEL : REPLY ]