Problem mit Zeitsteuerung der Game Loop

skappler

Aktives Mitglied
Hi Leute
Ich arbeite gerade an einem Spiel, aber habe noch Probleme mit der sleepTime in der Game Loop.
Hier ist erstmal mein Code:

Java:
public void run() {

		
		long beforeTime, afterTime, diff, sleepTime, overSleepTime = 0;
		int delays = 0;

		while (running) {
		
			
			beforeTime = System.nanoTime();
			
			update();
			render();

			afterTime = System.nanoTime();
			diff = afterTime - beforeTime;

			sleepTime = (period - diff) - overSleepTime;
			
			
			fps++;
			if(System.currentTimeMillis()-1000 >= lastFPSTime){
				lastFPSTime = System.currentTimeMillis();
				fpsb = fps;
				fps =  0;
			}
			
			
			if (sleepTime < period && sleepTime > 0) { // period ist die angestrebte Zeit
                                  // in diesem Fall 6 * 1000000
				
				
				
				
				try {
					game.sleep(sleepTime / 1000000L);
					overSleepTime = 0;
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} else {
				if (diff > period) {
					overSleepTime = diff - period;
				} else {
					if (++delays >= DELAYS_BEFORE_YIELD) {
						game.yield();
						delays = 0;
						overSleepTime = 0;
					} else {
						overSleepTime = 0;
					}
				}
			}
			
			
			
		}// while

	}

Das Problem ist jetzt, dass der Thread nie schläft, weil die SleepTime IMMER < 0 ist. Der Code stammt aus einem Tutorial, wo er auch funktioniert hat. Ich verstehe das Problem einfach nicht.

Kann mir einer sagen wo der Fehler liegt oder eine bessere Variante zur sicheren Zeiteinteilung sagen?
 
Zuletzt bearbeitet:
Wie groß ist period? Die einzige Variable, die man nicht sieht und die dafür verantwortlich sein kann, wenns NIE aufgerufen wird.
(Es sei denn deine Berechnugnen sind außerordentlich langwierig)
 
Dann kann diff ja eigentlich nur größer als period werden. Lass dir diff mal ausgeben und dann guck mal, wo der Performancefresser sitzt.
 
Der Zeitfresser ist definitiv die render() Methode. Das ganze zeichnen der Oberfläche ist sehr anspruchsvoll. Ich hab schon versucht das ganze zu vereinfachen, hat auch geklappt aber schneller gehts nicht.
 

Zurück
Oben