2010-04-14 10 views
4

나는 Java로 시뮬레이션을 작성하여 객체가 Newtonian 물리학에서 작동합니다. 물체에 힘이 가해지면 속도에 따라 움직입니다. 시뮬레이션의 본질은 애니메이션 루프의 현재 반복 이전 반복 사이의 시간에 따라 객체가 개별 단계로 이동한다는 것을 의미합니다. 예를 들어응용 프로그램/스레드에서 측정 된 측정 시간

애니메이션 스레드가있는이 원인 (클릭/최대화가 다시 그리기를 방지 최소화에 유지함으로써 Windows에서되는 고전적인 사례를) ellapse하기 위해 많은 시간을 일으키는 원인이 어떤 방법으로 지연되는 경우 문제가 발생
public void animationLoop() { 
    long prev = System.currentTimeMillis(); 
    long now; 

    while(true) { 
    long now = System.currentTimeMillis(); 
    long deltaMillis = now - prev; 
    prev = now; 

    if (deltaMillis > 0) { // Some time has passed 
     for (Mass m : masses) { 
     m.updatePosition(deltaMillis); 
     } 

     // Do all repaints. 
    } 
    } 
} 

놀라운 속도로 움직이는 물체. 내 질문 : wallclock 시간보다는 애니메이션 스레드에서 보낸 시간을 결정하는 방법이 있습니까, 또는 누군가가이 문제를 피하기 위해 해결 방법을 제안 할 수 있습니까?

지금까지 내 생각에 약간의 상한선으로 deltaMillis을 contstrain하는 것입니다.

+3

: 여기에 두 가지 좋은 선택이다. –

답변

6

루프로 회전하는 대신 타이머 같은 것을 사용 해본 적이 있습니까?

TimerTask tt = new TimerTask(){ 
    long prev = System.currentTimeMillis(); 
    public void run(){ 
    long now = System.currentTimeMillis(); 
    for (Mass m : masses) { 
     m.updatePosition(now-prev); 
    } 
    prev = now; 
    } 
} 

new Timer(true).schedule(tt, 1000, 1000) ; 

당신이 동안 (사실) 루프로 연속적으로 다시 그리기의 무리를해서는 안 적어도 당신의 오브젝트의 업데이트 사이에 약간의 지연이 보장되고, 스레드가 지연 될 경우이 방법 문서에서 즉각적인 재실행을 할 수는 없습니다. "고정 지연 실행에서 각 실행은 이전 실행의 실제 실행 시간과 관련하여 스케줄됩니다."

3

이 경우 특히 javax.swing.Timer.html이 유용합니다. 구형 입자와 컨테이너 벽 사이의 탄성 충돌을 모델링 한 example이 있습니다.

부록 : 관련 내용 approach은 모델을 뷰에서 분리하는 데 도움이 될 수 있습니다. 별도의 스레드가 시스템의 진화를 모델링하는 반면, 뷰는 모델의 "스냅 샷"을 고정 된 속도로 렌더링합니다.

어느 경우 든 가장 느린 대상 플랫폼을 수용 할 수있는 속도를 제한합니다.

+0

감사합니다. 이미 타이머를 사용하고 있지만 주어진 시스템이 지정된 프레임 속도를 따라 잡을 수 없다는 우려 때문에 타이머를 사용하고 싶습니다. 즉, 기계가 그것을 요구하기보다는 프레임 속도를 결정하기를 원합니다. – Adamski

+0

비록 내가 가장 좁은 대상 플랫폼을 기반으로하는 "렌더링 예산"측면에서 너무 좁게 생각하는 경향이 있지만. 몇 가지 통찰력을 제공 할 수있는 관련 예제를 추가했습니다. @ 짐 블랙 러의 충고가 가장 좋습니다. – trashgod

+0

Adamski의 뜨거운 그래픽을 볼 수 있습니다.Theyd blow ur mind –

1

article "Java : ThreadMXBean으로 스레드 시간 가져 오기"라는 제목의이 책을 읽는 것이 좋습니다.

기본적으로, Thread에 소요되는 시간을 가져올 수있는 ThreadMXBean 클래스가 있습니다. 나는 그것을 시도하지는 않았지만 방법 (그리고 제가 언급 한 기사의 예)이 유망 해 보입니다. 그래서 당신이 이것으로 원하는 것을 성취 할 수있을 것이라고 생각합니다.

+0

감사합니다. 나는 그것을 조사 할 것이다. – Adamski

0

휠을 다시 만들지 않고 애니메이션을 수행하기 위해 애니메이션 라이브러리를 사용했습니다. 델타를 상한하는 것은 나에게 좋은 해결책처럼 보인다