Threads Geschwindigkeit der Befehle auf verschiedenen PCs gleich machen

Blackhole16

Bekanntes Mitglied
Ich bin gerade dabei ein kleines Spiel zu entwickeln. Dies habe ich bisher auf einem Netbook gemacht, welches ein Intel Atom hat. u.a. habe ich einen ButtonCountdownThread geschrieben, der halt einen bestimmten Countdown auf einem Button anzeigt. Ich habe deisen auf dem netbook genau so eingestellt, dass 1sec auch einer sec entspricht und habe herausgefunden, dass für JButton.setText(String s) etwa 20ms gebraucht werden.
Also hier der relevante Code:

Java:
for (int i = cd; i > 0; i-=70) {
	b.setText((i/1000) + " s");
	try {
		Thread.sleep(50);
	} catch (InterruptedException e) {e.printStackTrace();}
}

Nun habe ich dies auf meinem Gamer-PC (siehe Signatur) getestet und da vergehen 3secs des CDs in nur 2 Sekunden. Auch die Animationen (ziehmlich viele Befehle) läuft viel schneller ab, was das ganze Spielgeschehen unpassender macht.

Deshalb wollte ich fragen, ob ich irgendwie einstellen kann, dass diese Befehle auf unterschiedlichen PCs glaich lange dauern. Gibt es da von Java aus selber etwas oder muss ich das irgendwie kompliziert erstellen?

Ich habe schon überlegt, ob vielleicht ein Timer-Thread sinvoll wäre, mit dem ich dann feststellen kann, wie lange der Thread noch schlafen muss, damit er wieder "in time" ist. Das scheint mir aber sehr kompliziert zu werden, weswegen ich lieber hier erst einmal um Hilfe bitten möchte, ob es auch etwas einfacheres gibt.

Danke schon im Voraus für eure Mitarbeit.
mfg
BH16
 
Das Konzept sieht -mal eben so hingeschrieben- so aus:


Java:
public static final int DESIRED_FRAME_TIME = 1000/60;

[...]

long time = System.currentTimeMillis();
long dt = 0;

while(true){
time = System.currentTimeMillis();
doWhateverYouWantToDo(dt);
dt = System.currentTimeMillis() - time;

if (dt < DESIRED_FRAME_TIME) {
  Thread.sleep(DESIRED_FRAME_TIME - dt);
  dt = System.currentTimeMillis() - time;
}

}



[...]

private void doWhateverYouWantToDo(int dt) {
  // hier deine Spiellogik ausführen, dabei beachten, dass seit dem letzten Aufruf dt ms vergangen sind. 
//D.h. willst du, dass pro Sekunde einmal etwas blinkt brauchst du z.B. einen zähler, auf den du dt draufaddierst.
//Sobald der bei 1000 ist, setzt du ihn wieder auf 0 und lässt es einmal blinken.
}

EDIT:
so jetzt ist es auch richtig, hoffe ich xD
 
Zuletzt bearbeitet:
na da war mein ansatz ja gar nicht so schlecht, oder? ;D

Danke, ich habe es modifiziert übernommen, jetzt ist es kein Problem. Ich habe festgestellt, dass mein Gamerpc üfr die Befehle 0-1 ms braucht, mein netbook schon 4-7. Ist doch schon ein gewaltiger Unterschied...

Danke auf jeden Fall an Beide.

mfg
BH16
 

Neue Themen


Zurück
Oben