Mon jeu java fonctionne au ralenti sur différents ordinateurs


Je suis en train de développer un jeu, et je voulais juste le tester sur un autre ordinateur pour vérifier si les résolutions sont correctes et tout ça, mais j'ai remarqué un gros problème, le jeu tourne au ralenti pour une raison quelconque... Pas de lag, mais au ralenti.. Ma boucle de jeu est temporaire:

while(gameisRunnin){
     doStuff();
     Thread.sleep(1000/60);

, Mais après le test, j'ai essayé de vérifier combien de temps faut-il pour faire le doStuff(); le code et je l'ai testé comme ceci:

while(gameisRunnin){
     long startT = System.currentTimeMillis();
     doStuff();
     long stopT = System.currentTimeMillis();
     System.out.println(stopT-startT);
     Thread.sleep(1000/60);

Le résultat qu'il me donne est 0, sur les deux ordinateurs, (Sur le un je développe le jeu qui fonctionne à la vitesse parfaite, et sur le PC qu'il fonctionne au ralenti.. Aussi je l'ai testé avec nano time, cela me donne comme 50000-80000 sur les deux calculs aussi (à peu près le même résultat. Sérieusement c'est quoi? Un superman pourrait-il me sauver?

MISE À JOUR: Ok donc quand je lance le jeu sur l'autre ordinateur PAS en plein écran, il fonctionne bien, mais quand il est en plein écran, c'est slowmotion Mettre: On dirait que je suis le super-héros ici, j'ai défini le displaymode le taux de rafraîchissement à l'inconnu, je suppose que c'était tout le problème...

Author: Cœur, 2013-10-06

3 answers

Vous devez utiliser quelque chose que l'on appelle habituellement "delta time". Fondamentalement, cela signifie que vous mesurez le temps qu'il faut pour faire une itération de la boucle de jeu, puis utilisez ce nombre pour tous les mouvements.

Ceci est dû au nombre différent de FPS sur différents ordinateurs. Au lieu de déplacer des objets pour une quantité constante de pixels, vous définissez la vitesse et calculez dynamiquement la taille réelle du mouvement.

Exemple court:

public void gameLoop() {
    long initialTime = System.nanoTime();

    game.redraw();
    game.update(System.nanoTime() - initialTime);
}

// inside the class Game
public void update(long deltaTime) {
    someObject.moveToRight(deltaTime * speed);
}
 2
Author: tzima, 2013-10-06 18:57:47

La réponse est que le taux de rafraîchissement du jeu n'était pas pris en charge par le moniteur, le changement du taux de rafraîchissement de 60 à DisplayMode.REFRESH_RATE_UNKNOWN résout le problème de slowmotion.

 1
Author: user2852371, 2013-10-06 19:47:00

Lire cet article: cliquez ici

Aussi, comme une note de côté, utilisez Système.nanoTime () parce que le système.getTimeMillis () n'est pas aussi précis.

 0
Author: Troubleshoot, 2013-10-06 18:48:23