# Game Loop



## Sogomn (25. Feb 2014)

Ich mache mich gerade an die Spieleprogrammierung mit Java. Leider verstehe ich die berühmte 'Game Loop' nicht so ganz.
Ich habe dazu einige Fragen:

Was ist die Variable 'delta'?
Was ist die Variable 'lastFpsTime'?
Was ist der Unterschied zwischen der Methode render() und update()?
Warum benutzt man nicht einfach einen Timer?

Hier z.B. eine Game Loop, die ich nicht verstehe...

```
public void gameLoop()
{
   long lastLoopTime = System.nanoTime();
   final int TARGET_FPS = 60;
   final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;   

   // keep looping round til the game ends
   while (gameRunning)
   {
      // work out how long its been since the last update, this
      // will be used to calculate how far the entities should
      // move this loop
      long now = System.nanoTime();
      long updateLength = now - lastLoopTime;
      lastLoopTime = now;
      double delta = updateLength / ((double)OPTIMAL_TIME);

      // update the frame counter
      lastFpsTime += updateLength;
      fps++;
      
      // update our FPS counter if a second has passed since
      // we last recorded
      if (lastFpsTime >= 1000000000)
      {
         System.out.println("(FPS: "+fps+")");
         lastFpsTime = 0;
         fps = 0;
      }
      
      // update the game logic
      doGameUpdates(delta);
      
      // draw everyting
      render();
      
      // we want each frame to take 10 milliseconds, to do this
      // we've recorded when we started the frame. We add 10 milliseconds
      // to this and then factor in the current time to give 
      // us our final value to wait for
      // remember this is in ms, whereas our lastLoopTime etc. vars are in ns.
      try{Thread.sleep( (lastLoopTime-System.nanoTime() + OPTIMAL_TIME)/1000000 )};
   }
}

private void doGameUpdates(double delta)
{
   for (int i = 0; i < stuff.size(); i++)
   {
      // all time-related values must be multiplied by delta!
      Stuff s = stuff.get(i);
      s.velocity += Gravity.VELOCITY * delta;
      s.position += s.velocity * delta;
      
      // stuff that isn't time-related doesn't care about delta...
      if (s.velocity >= 1000)
      {
         s.color = Color.RED;
      }
      else
      {
         s.color = Color.BLUE;
      }
   }
}
```
Von der Seite: Java-Gaming.org

MFG Sogomn


----------



## Sogomn (26. Feb 2014)

Verstanden! Intensiv Java Sourcecode angucken hilft!


----------



## Hestalon (27. Feb 2014)

Dir könnte eventuell das hier weiterhelfen bzw. geht noch etwas weiter als man normalerweise muss 

KLICK MICH FESTE!


----------

