2010-03-20 5 views
2

Je développe un jeu d'échecs pour Android (http://androidchess.appspot.com), en utilisant SurfaceView pour l'échiquier. J'ai un dessin Thread, qui dessine l'échiquier en boucle. Le problème est que quand il n'y a pas d'animations actives (c'est plus que 90% du temps), cela n'a aucun sens de gaspiller le CPU et la batterie pour le dessin. Comment devrais-je résoudre ceci? Peut-être en pause et en reprenant le dessin Thread?Mettre en pause et reprendre le dessin de fil à SurfaceView

+0

@fhucho J'ai un exemple simple pour vous ... voir ma réponse pour plus de détails. – Kiril

Répondre

3

Essayez quelque chose comme ça (vous pouvez le tester en essayant this code):

final Object monitor = new Object(); 

class Drawing implements Runnable 
{ 
    @override 
    void run() 
    { 
     while(true) 
     { 

      synchronized(monitor) 
      { 
       monitor.wait(); 
      } 

      // draw 
     } 
    } 
} 

public static void main(String[] args) { 

    // start your thread 
    while(true) 
    { 
     if(needRefresh) 
     { 
      synchronized(monitor) 
      { 
       monitor.notify(); 
      } 
     } 
    } 
} 

Je recommande d'utiliser un Semaphore si vous voulez signaler une fois, puis garder le dessin (ie ne bloque pas) jusqu'à ce que le signal est éteint.

+0

Merci, attendez/notez est exactement ce que je cherchais. – fhucho

0

Vous avez à peu près répondu à la question vous-même. Vous devez mettre en pause votre fil de dessin lorsque rien n'est rendu. Lorsque vous utilisez OpenGL SurfaceView, vous pouvez également utiliser un mode immédiat (qui dessine en continu) ou manuel (dessiner sur demande).

+0

Mais comment exactement dois-je faire une pause/reprendre le fil? Le Thread.suspend() est obsolète selon la documentation d'Android. – fhucho

+0

l'approche ci-dessus de lirik fonctionnerait je présume. Une autre approche plus moderne consisterait à utiliser les classes de concurrence java en combinaison avec une approche Lock/Condition ou similaire. – Moritz

Questions connexes