2017-09-28 41 views
0

Comment limiter l'utilisation du processeur en utilisant ce code pour mon jeu Java? Je pense qu'un moyen pourrait être d'utiliser Thread.sleep() mais seulement si je peux calculer l'heure ou quelque chose comme ça. Quelqu'un peut-il m'aider s'il vous plaît?Comment puis-je limiter l'utilisation du processeur?

public void run(){ 
    this.requestFocus(); 
    long lastTime = System.nanoTime(); 
    double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    long timer = System.currentTimeMillis(); 
    int frames = 0; 
    while(isRunning){ 
     long now = System.nanoTime(); 
     delta += (now - lastTime)/ns; 
     lastTime = now; 
     while(delta >= 1){ 
      tick(); 
      delta--; 
     } 
     render(); 
     frames++; 

     if(System.currentTimeMillis() - timer > 1000){ 
      timer += 1000; 
      frames = 0; 
     } 
    } 
    stop();  
} 
+1

Pourriez-vous s'il vous plaît préciser, pourquoi vous souhaitez limiter le temps CPU de votre boucle de jeu? Peut-être que tu devrais penser à ton design. –

+0

Qu'est-ce que 'tick()' Pourquoi ne faites-vous pas quelque chose comme 'Thread.sleep (delta/1000);' au lieu de 'tick()', et 'delta -;'? – matt

+0

tick() est mon appel de mise à jour. J'ai besoin de limiter mon processeur parce qu'il utilise environ 90% pour une raison quelconque. Je pense que c'est parce que j'appelle la boucle autant de fois possible. Le thread.sleep fonctionnerait-il? Si oui, et pour combien de temps? –

Répondre

0

Cela semble assez simple à l'exception des parties manquantes. Considérons que vous voulez mettre à jour à un taux fixe.

while(isRunning){ 


    tick(); 
    render(); 
    long now = System.nanoTime(); 
    double delta = now - lastTime; 
    double remaining = delta - ns; 
    if(remaining>1000){ 
     try{ 
      Thread.sleep((int)(remaining/1000)); 
     } catch(InterruptedException e){ 
      throw new RuntimeException(e); 
     } 
    } 

    frames++; 
    lastTime = System.nanoTime(); 
    if(System.currentTimeMillis() - timer > 1000){ 
     timer += 1000; 
     frames = 0; 
    } 
} 
+0

Donc, je devrais mettre tout cela sous: (en cours d'exécution) {} –

+0

Cela devrait remplacer votre boucle 'while (delta> = 1)'. Je peux le mettre à jour avec la boucle 'while (isRunning)' complète. – matt

+0

D'accord, merci. Donc, je devrais garder tout sauf la boucle delta que je vais remplacer par ce code? –