2015-01-19 4 views
0

Thread.sleep(milliseconds)을 사용하면 지정된 밀리 초 동안 전체 프로그램 실행이 지연됩니다. 내 문제는 어떻게 내 컨테이너에서 자바 코드 (캔버스 컨텍스트에서 JOGL을 사용하여 구현 됨)의 다른 컨테이너로 개체 이동을 지연시키지 않고 (지연시키지 않고) 동작이 눈에 띄게 빨라지는지입니다.java JOGL에서 객체 이동이 느려짐

다음은 문제에 대한 나의 접근 방법입니다.

각 컨테이너의 개체 양을 나타 내기 위해 Stack을 사용합니다. 사용자가 컨테이너 [소스] 중 하나를 클릭 할 때마다 컨테이너 Stack은 비워 질 때까지 팝됩니다. 동시에 대상 컨테이너의 Stack을 푸시해야합니다. 각 반복마다 컨테이너는 해당하는 Stack 크기로 표시된 객체를 포함하여 다시 그립니다.

이 질문에 대한 관련 코드의 부분 : 나는 단지 하나의 목적지 하나에 소스에서 개체를 이동하는 데 성공하지만, 한


public void moveObjects(Container source, Container destination) { 
    while (!source.stack.isEmpty()) { 
    destination.stack.push(destination.stack.size() + 1); 
    source.stack.pop(); 
    //redraw both containers with their new amount of objects represnted using their stack size 
    } 
} 

또는

이 가 가
public void moveObject(int source, int dest) { 
    while (!this.container[source].stack.isEmpty()) { 
    this.container[dest].stack.push(this.container[dest].stack.size() + 1); 
    this.container[source].stack.pop(); 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException ie) { 
     // Handle exception here 
    } 
    } 
} 
가 가 는 움직임이 너무 눈으로 빨리 알아 차릴 수있다. 이 문제를 어떻게 해결할 수 있습니까?

+0

당신이 무엇을 요구하고 있는지 명확하지 않습니다. 문제를 자세히 설명해 주시겠습니까? 코드를 사용하는 것이 바람직합니다. – Dawnkeeper

+0

좋아, 내가 가지고 실제 코드를 작성하자 –

답변

1

정확하게 이해한다면이 순간에 즉시 여러 개체를 화면에서 눈에 띄게 이동할 수 있습니다.

Thread.sleep(time)을 눈치 챘을 때 전체 응용 프로그램이 정지되므로 안 좋은 생각입니다. 이 허용

long lastTime = System.nanoTime(); 
while(running) 
{ 
    long now = System.nanoTime(); 
    updateLogic(now-lastTime); //this handles your application updates 
    lastTime = now; 
} 

void updateLogic(long delta) 
{ 
    ... 
    long movementTimespan +=delta 
    if(movementTimespan >= theTimeAfterWhichObjectsMove) 
    { 
     //move objects here 
     //... 
     movementTimespan -= theTimeAfterWhichObjectsMove; 
    } 

    //alternatively you could calculate how far the objects have moved directly from the delta to get a smooth animation instead of a jump 
    //e.g. if I want to move 300 units in 2s and delta is x I have to move y units now 

} 

당신이 마지막 업데이트/프레임 이후의 시간을 추적하고 당신이 애니메이션을 사용하는 경우는 속도를 만든다 :

이 주위에 방법은 경과 시간으로 업데이트 논리를 공급하는 것입니다 실행 시스템 스파이와는 독립된 객체 이동

+0

나는 당신의 대답을 해결하기 위해 노력하고 있습니다. 라인은 "lastTime = 0 now"입니다. –

+1

오타^_^'나는 그것을 바로 잡았다. 그것은 단지 lastTime을 현재 값으로 재설정합니다. – Dawnkeeper

+0

답변 해 주셔서 감사합니다. 나는 아직도 그것에 의아해한다. 나에게이 책에 대해 좋은 제안을 해주길 바란다. –