전공 자료/JAVA2011.05.28 21:37

[출처 : http://blog.naver.com/PostView.nhn?blogId=so1ine&logNo=40067960442&categoryNo=18&viewDate=&currentPage=1&listtype=0&userTopListOpen=false&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=undefined]

Java Animation

규칙적인 시간간격을 두고 이미지를 보여주는 애니메이션 작업을 하는 프로그램들은 애니메이션 루프를 사용해야 합니다.

방법 1. 애니메이션 수행 시 새로운 스레드를 생성하는 것이 적절합니다.

Thread aniThread;

aniThread = new Thread(this);

aniThread.start();

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

방법 2. 연속적인 이미지를 가져와야 합니다.

For(int i=I;i<-frame;i++){

    Car = getImage(getCodeBase(), name+i+.gif);

}

방법 3. 각각의 프레임을 컴포넌트 상에서 지우고 디스플레이하기 위한 메소드를 호출합니다.

..

i++;

int j = i%frame;

image =(Image) vec.elementAt(j);

repaint();

..

방법 4. frame rate(어떤 이미지가 디스플레이기가 되고 난 후 다음에 오는 이미지를 디스플레이하기 까지 걸리는 시간)을 결정합니다.

Public void delay(long mill){

Try{

Thread.sleep(milli);

}catch(Exception ignored){}

}

 

Animation의 문제점

1. 화면이 심하게 깜박이는 문제

 이미지 로딩 시스템에 의해 이미지 데이터가 갱신될 때마다 기존의 이미지를 지우고 다시 이미지를 그리기 위해  update()가 디폴트로 호출됩니다.

디폴트로 호출된 update()는 화면 전체를 지우는 역할을 합니다.

• 실제 모니터의 리프레쉬 간격보다 paint() 의한 drawing 작업시간이  길기 때문에

 

해결방법 1> update()를 디폴트로 호출하지 않고, 재정의하여 사용할 경우, 이미지 데이터의 갱신과는 관계없이 repaint()가 호출할 때에만 새로운 이미지가 그려지게 됩니다.

 

해결 방법 2> 버퍼에 Grahpics 객체를 만들어 두고, 이미지가 Graphics 객체에 모두 그려진 다음에 화면에 복사하는 더블 버퍼링을 사용하여 향상시킵니다.

① off-screen 이미지를 만들고, Graphics 객체를 얻습니다.

width = image.getWidth(this);

height = image.getHeight(this);

offScreenImage = createImage(width, height);

② 버퍼위의 off-screen 그래픽 객체를 만들어 직접 애플릿 상에 그리는 대신 off-screen 객체에 그리기 작업을 수행합니다.

offScreenGraphics = offScreenImage.getGraphics();

offScreenGrahics.drawImage(someImage, 0, 0, this);

 off-screen 그래픽 객체를 애플릿 그래픽 객체에 복사합니다.

g.drawImage(offScreenImage, 0, 0, this);

 

 

2. 이미지를 가져오는데 걸리는 시간 때문에, 이미지가 부분적으로만 디스플레이 되거나, 디스플레이 되지 않을 수 있는 문제

해결방법 > MediaTracker 는 이미지가 부분적으로 디스플레이 되거나, 이미지를 로드하는데 걸리는 시간을 단축시키며, 애니메이션에 사용되는 이미지들을 쉽게 다운로드 받게 해주고, 이미지들이 완전히 로드되었을 때를 알려줍니다.

 

MeidaTracker tracker = new MediaTracker(this);

MediaTracker의 생성자는 이미지가 그려질 Component객체를 매개변수로 받는다.

tracker.addImage(img[i], 0);

tracking할 이미지에 ID 부여

tracker.waitForID(0);

현재 MediaTracker가 tracking하는 모든 이미지들이 로딩되기 시작한다.

checkAll 메소드는 MediaTracker에 의해 tracking되는 모든 이미지들의 로딩이 끝났는지를 검사한다.

boolean 형으로 true를 할당하면, 아직 로드 되지 않은 이미지들을 로딩하기 시작한다.

디폴트 값은 false이므로 tracking 도중에 에러가 발생하면 true를 리턴하며 isErrorAny()나 isErrorID()를 사용하여 에러 발생 여부를 알아내야 한다.

Posted by dlucky

[출처 : http://ttongfly.net/zbxe/?document_srl=124193]

RFC 3550의 개요

실시간 음성, 영상 데이타를 IP 네트워크 상에서 전송하기 위해서는 항상 RTP를 사용합니다. RTP는 RFC 1889 A Transport Protocol for Real-Time Applications에 정의되어 있었지만, 2003년 RFC 1889를 대신하는 RFC 3550이 Standards Track으로 채택 되면서, RFC 1889가 폐기되었습니다. 따라서, 요즘 나오는 음성 및 영상 장비들은 RTP 3550을 지원합니다. 

간략하게 RFC 3550의 앞부분에 명시된 개요 부분을 요약하면, RTP는 음성, 영상 또는 시뮬레이션 데이터와 같은 실시간 데이터를 멀티캐스트 또는 유니캐스트 네트워크를 이용하여 전송하는 응용 서비스를 위한 end-to-end 네트워크 전송 프로토콜입니다. RTP는 IP/UDP를 통해 전송되며, RTCP (Real-time Control Protocol)에 의해 데이터의 전달 상황을 감시하며, 최소한의 제어 기능과 미디어 식별 기능을 제공합니다. 

RTP는 음성, 영상, 실시간 데이터 등을 전송하기 위한 프로토콜이라는 것을 알 수 있습니다.

less..

RTP의 헤더 구조

프로토콜을 이해하기 위해서는 프로토콜의 헤더 구조를 이해하는 것이 가장 쉽게 이해할 수 있습니다. 다음 그림은 RTP 프로토콜 헤더 구조로써 RFC 3550에서 발췌하였습니다.

  • V (version) : 2 bit 
    RTP의 Version을 나타냅니다. 현재는 2 값을 항상 표시합니다. 
  • P (padding) : 1 bit 
    만일 패킷 마지막에 하나 이상의 패딩 바이트가 있을 경우를 나타냅니다. 패팅 비트란, 의미가 없는 비트를 의미합니다. 패킷을 만들기 위해 의도적으로 추가된 비트입니다. 
  • X (Extension) : 1 bit 
    고정 헤더 이후의 하나의 확장헤더가  추가적으로 있음을 의미합니다. 
  • CC (CSRC Count) : 4 bit 
    12 바이트 고정헤더 이후에 표시되는 CSRC identifier의 수를 표시합니다. 
  • M (Marker) : 1 bit 
    패킷 스트림 내에서 프레임 경계와 같은 중요한 이벤트들을 표시하는 데 이용됩니다. 항상 트러블 슈팅시에 보면 중요할 것 같지만, 별로 의미가 없는 비트입니다. 다음에 오는 PT 필드의 확장하여 표시 비트를 없애기도 합니다. 
  • PT (Payload Type) : 7bit 
    RTP 페이로드의 타입을 나타냅니다. 즉, RTP가 전송하고 있는 내용이 G.711로 되어있는 지 H.264로 되어 있는지 등에 대한 정보를 나타냅니다. 또한, 수신 장비가 페이로드 타입을 이해할 수 없다면 반드시 무시해야 합니다. 이 말의 의미는 실제 Payload Type은 Capability Exchange 시에 항상 교환되므로 상호 인지를 하고 있어야 한다는 것입니다. 
  • Sequence number : 16 bit 
    Sequence number는 보안상의 이유로 랜덤한 번호에서 시작하지만, 패킷이 증가할 때마다 1씩 증가됩니다. 이를 통해 수신장비는 패킷 손실을 인지하고, 복구 매커니즘을 동작하도록 합니다. 
  • Timestamp : 32 bit 
    RTP 패킷의 첫번째 바이트의 샘플링 순간을 나타냅니다. 초기값은 Sequence number와 마찬가지로 랜덤하게 결정됩니다. 만일 샘플링이 160 단위로 발생한다면 각 블럭은 160 단위로 증가하게 될 것입니다. 실제 코덱마다 샘플링 레이트가 차이가 있으므로 그에 맞게 증가한다고 보시면 됩니다. 
  • SSRC (Synchronization Source) Identifier : 32 bit 
    동기화 소스를 나타내며, 랜덤하게 결정됩니다. 같은 RTP 세션내에 서로 다른 값을 가져야 합니다. 
  • CSRC (Contributing Source) Identifiers : 32 bit 
    다수의 음원이 Audio Mixer를 통해 하나로 통합될 경우 나타냅니다 .따라서, 이 필드를 통해 원 음원에 대해 나타냅니다. 이 목록에서는 모든 음원의 SSRC identifier가 포함됩니다. 

'4학년1학기 > 네트워크' 카테고리의 다른 글

[네트워크] RTP 패킷 헤더  (0) 2011.05.13
Posted by dlucky