2017-05-21 6 views
0

Je crée un exemple de jeu dans la toile dans une vue de surface.Android - Pause et reprise du fil rend mon fil lent

J'utilise un certain temps avec les méthodes de mise à jour et de dessin, tout fonctionne. Maintenant, j'essaie de faire une pause et de reprendre le jeu. Avec les méthodes que j'ai trouvé sur Internet travaillé, mais quand le jeu est repris, il est beaucoup plus lent.

Mon jeu en boucle:

 

    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. 
    } 

Et ma pause et méthode resume:

 

    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(); 
    } 

Est-ce que quelqu'un sait pourquoi ralentissement? Et la solution? (Note: J'ai essayé de donner un sommeil fixe au lieu d'une variable, le résultat est la même lenteur)

Merci.

@EDIT

J'ai trouvé la peine.

Mon activité avait un écouteur onResume(), et cela lance le thread init ... Mais sur ma construction de surfaceview je le fais aussi ... Reprise: Quand le jeu est démarré, avoir 2 threads ... pause ne pas faire le jeu trop lent, la pause fait le jeu est à la bonne vitesse ... Le jeu de départ faire le jeu ont 2 thread (et 2 mises à jour)

Merci.

Répondre

1

si playing est faux, il n'y a pas besoin de sleep le fil, vous pouvez le faire comme ceci:

// 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; 
} 

Je pense que votre problème d'origine est ce code:

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

chaque fois vous "reprenez" le jeu que vous créez un nouveau fil, cela pourrait être une habitude de mémoire intensive si vous vous attendez à ce qu'il fasse beaucoup de pause (à en juger par la durée du sommeil()). Essayez de garder un seul fil autour et juste de basculer les drapeaux.

+0

J'ai essayé, mais le résultat est le même. –

+0

Je ne comprends pas. –

+0

while (lecture) { if (isPaused) {.... jeu boucle }} OnPause: isPaused = true; OnResume: IsPaused = false; –