# Problem mit Zeitsteuerung der Game Loop



## skappler (1. Apr 2012)

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


```
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?


----------



## Fu3L (1. Apr 2012)

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)


----------



## skappler (1. Apr 2012)

Fu3L hat gesagt.:


> 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)



Hab ich grad eben geändert


----------



## Fu3L (1. Apr 2012)

Dann kann diff ja eigentlich nur größer als period werden. Lass dir diff mal ausgeben und dann guck mal, wo der Performancefresser sitzt.


----------



## skappler (1. Apr 2012)

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.


----------

