2017-05-21 1 views
0

캔버스에 샘플 게임을 표면보기로 만듭니다.안드로이드 - 스레드를 일시 중지하고 다시 시작하면 스레드가 느려집니다.

저는 업데이트와 그리기 방법을 사용하면서 잠시 사용하고 있습니다. 이제 게임을 일시 중지하고 다시 시작하려고합니다. 인터넷에서 발견 된 방법으로 게임을 다시 시작하면 훨씬 느려집니다.

내 루프 게임 :

 

    while(playing){ // on runnable thread 
     update(); // update all objects of the game 
     draw(); // draw all objects of the game 
     control(); // first remove dead objects, after sleep the Thread. 
    } 

그리고 내 일시 정지 및 재개 방법 :

 

    public void pause(){ 
     playing = false; 
     try{ 
      gameThead.sleep(17); 
     } catch(ex){}; 
    } 

    public void resume(){ 
     playing = true; 
     gameThread = new gameThread(this); // this object is a runnable 
     gameThread.start(); 
    } 

사람이 왜 느려지 알고 있나요? 그리고 그 해결책? (참고 : 변수 대신 고정 된 수면을 주려고했는데 그 결과는 같은 속도 임)

고마워.

@EDIT

나는 문제를 발견했다.

내 활동에 리스너 onResume()이 있었는데이 스레드가 시작됩니다 ...하지만 표면 뷰의 구조에서 나는 그것을 너무합니다 ... 다시 시작 : 게임이 시작되면 2 개의 스레드가 있습니다 ... 일시 정지는 게임을 너무 느리게하지 않으며 일시 중지는 올바른 속도에 있습니다 ... 시작 게임에 2 개의 스레드가 있습니다 (및 2 업데이트)

고마워요.

// my thread 
while(playing && !paused){ // on runnable thread 
    update(); // update all objects of the game 
    draw(); // draw all objects of the game 
    control(); // first remove dead objects, after sleep the Thread. 
} 

public void pause(){ 
    paused = true; 
} 

public void resume(){ 
    paused = false; 
} 

public void quit() { 
    playing = false; 
} 

내가 원래 문제가 생각이 코드입니다 :

gameThread = new gameThread(this); // this object is a runnable 
    gameThread.start(); 

마다 playing이 거짓

답변

1

경우, sleep 할 필요 스레드, 당신은 이런 식으로 그것을 할 수는 없다 당신은 새로운 스레드를 만들고있는 게임을 "다시 시작"하고 있습니다. 잠깐 (잠의 길이로 판단하여) 멈추기를 기대한다면 이것은 메모리 집약적 인 습관이 될 수 있습니다. 단일 스레드를 유지하고 플래그를 토글 해보십시오.

+0

시도했지만 결과는 같습니다. –

+0

나는 이해하지 못한다. –

+0

동안 {{ .... 루프 게임 } 경우 (isPaused) } (재생) OnPause : isPaused = TRUE; OnResume : IsPaused = false; –

관련 문제