Wie kann ich Kappe meine framerate bei 60 fps in Java?
Ich bin writting ein einfaches Spiel, und ich will die cap meine framerate bei 60 fps, ohne dass die loop-Essen meine cpu. Wie kann ich dies tun?
InformationsquelleAutor der Frage William | 2009-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen Sie die Game Loop Artikel. Es ist sehr wichtig, dass Sie zuerst verstehen, die verschiedenen Methoden für die Spiel-Schleife, bevor Sie versuchen zu implementieren nichts.
InformationsquelleAutor der Antwort cherouvim
Nahm ich die Game Loop Artikeldass @cherouvim gepostet, und ich habe die "Beste" Strategie und versucht zu umschreiben, dass es für eine java-Runnable, scheint zu funktionieren für mich
InformationsquelleAutor der Antwort Parth Mehrotra
Die einfache Antwort ist, dass wir eine java.util.Timer, um das Feuer alle 17 ms und tun Sie Ihre Arbeit in dem timer-Ereignis.
InformationsquelleAutor der Antwort Lawrence Dol
Hier ist, wie ich es in C++... ich bin sicher, Sie können es anpassen.
Nenne es einfach mit
capFrameRate(60)
einmal pro Schleife. Es wird schlafen, damit Sie nicht verschwenden wertvolle Zyklen.glfwGetTime()
gibt die Zeit seit dem Programmstart in Sekunden... ich bin sicher, Sie finden ein äquivalent in Java irgendwo.InformationsquelleAutor der Antwort mpen
Hier ein Tipp für die Verwendung von Swing und erste einigermaßen genaue FPS, ohne über einen Timer.
Erstens laufen Sie nicht die Spiel-Schleife in der event dispatcher thread ausgeführt werden soll in einem eigenen thread tun, die harte Arbeit und nicht immer in den Weg der UI.
Die Swing-Komponente stellt das Spiel sollte sich selbst zeichnen das überschreiben dieser Methode:
Der Haken ist, dass die Spiel-Schleife nicht wissen, Wann der event dispatcher thread hat sich tatsächlich herumgesprochen zu der Ausführung der paint-Aktion, weil in der Spiel-Schleife, die wir einfach anrufen-Komponente.repaint (), fordert eine "nur malen", das kann später passieren.
Wait/notify können Sie das redraw-Methode zu warten, bis die angeforderte Farbe ist passiert, und dann weiter.
Hier ist die komplette funktionierende code aus https://github.com/davidmoten/game-explorationdas eine einfache Bewegung der Schnur über ein JFrame mit der Methode oben:
InformationsquelleAutor der Antwort Dave Moten
Timer ist ungenau für die Steuerung von FPS in java. Ich habe festgestellt, dass aus zweiter hand. Sie implementieren müssen, um Ihren eigenen timer oder tun Echtzeit-FPS mit Einschränkungen. Aber verwenden Sie keine Zeitschaltuhr, da es nicht 100% genau, und kann daher nicht der Durchführung von Aufgaben richtig.
InformationsquelleAutor der Antwort abc123
Was ich gemacht habe, ist nur weiter zu Durchlaufen, und behalten Sie den überblick, Wann ich das Letzte hab eine animation. Wenn es mindestens 17 ms dann gehen Sie durch die animation Sequenz.
Diese Weise konnte ich überprüfen Benutzereingaben, und drehen Sie die Noten auf - /ausschalten, wie gebraucht.
Aber, das war in einem Programm zu helfen, lehren Musik, Kinder und mein Antrag wurde in Beschlag des Computers, es war fullscreen, so dass Sie nicht gut mit anderen spielen.
InformationsquelleAutor der Antwort James Black
Wenn Sie mit Java Swing der einfachste Weg ist, um ein 60-fps wird durch die Einrichtung eines javax.swing.Timer wie diese und ist ein gemeinsamer Weg, um Spiele:
Und irgendwo in deinem code muss dieser timer zu wiederholen, und starten Sie es:
Jede Sekunde hat 1000 ms und teilen diese mit Ihren fps (60) und das einrichten des Timers mit dieser Verzögerung (1000/60 = 16 ms abgerundet) erhalten Sie eine etwas Feste framerate. Ich sage "etwas", denn dies hängt stark auf, was Sie tun, in der updateModel() und repaintScreen () - Aufrufe vor.
Mehr zu bekommen, vorhersagbare Ergebnisse, versuchen Sie die beiden Anrufe in den timer und stellen Sie sicher, Sie fertig, innerhalb von 16 ms hochzuhalten 60 fps. Mit smart preallocation von Speicher -, Objekt-Wiederverwendung und andere Dinge, die Sie reduzieren können die Auswirkungen der Garbage Collector auch. Aber das ist eine andere Frage.
InformationsquelleAutor der Antwort Johncl
In java könnten Sie tun
System.currentTimeMillis()
um die Zeit in Millisekunden stattglfwGetTime()
.Thread.sleep(time in milliseconds)
macht der thread warten, wenn Sie nicht wissen, und es muss innerhalb einertry
block.InformationsquelleAutor der Antwort Anonymous
Gibt es eine Menge guter Informationen hier schon, aber ich wollte zu teilen, ein problem, dass ich hatte mit diesen Lösungen, und die Lösung. Wenn, trotz all dieser Lösungen, ist Ihre Spiel/Fenster scheint zu überspringen (vor allem unter X11), versuchen Sie den Aufruf
Toolkit.getDefaultToolkit().sync()
einmal pro frame.InformationsquelleAutor der Antwort zrneely