# Double Buffering angewendet?



## kingharun27 (24. Apr 2015)

Also meine Frage ist, ob hier das Double Buffering angewendet wurde?


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;

import javax.swing.JPanel;


public class Fenster extends JPanel implements Runnable
{
	// Variablen
	
	public static final int BREITE = 800;
	public static final int HÖHE = 400;
	
	private static float timeSinceLastFrame;
	private static int FPS = 30;
	
	private boolean running = false;
	private Thread thread;
	
	private Image image;
	private Graphics2D g;
	
	Spieler spieler = new Spieler(BREITE, HÖHE);

	// Konstruktor
	
	public Fenster()
	{
		super();
		setPreferredSize(new Dimension(BREITE, HÖHE));
		setFocusable(true);
		requestFocus();
		
		
	}
	
	public void addNotify() 
	{
		super.addNotify();
		
		if(thread == null)
		{
			thread = new Thread(this);
		}
		
		thread.start();
		System.out.println("Thread gestartet");
		
		addKeyListener(new Tastatur());
	}
	
	// Hauptspiel
	
	@Override
	public void run()
	{
		
		running = true;
		long lastFrame = System.currentTimeMillis();

		while(running)
		{
			long thisFrame = System.currentTimeMillis();
			timeSinceLastFrame = (float) (thisFrame - lastFrame)/1000;
			lastFrame = thisFrame;
			
			Update();
			Zeichnen();
			Rendern();
		
			try 
			{
				Thread.sleep(1000 / FPS);
			} 
			catch (InterruptedException e) 
			{
				e.printStackTrace();
			}
			
		}
		
		System.exit(0);
		
	}	// Hauptspiel Ende

	
	private void Zeichnen()
	{
		image = createImage(BREITE, HÖHE);
		g = (Graphics2D) image.getGraphics();
		
		Graphics2D g2d = (Graphics2D) g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		// Zeichnen
		
		g.setColor(Color.GREEN);
		g.fillRect(0, 0, BREITE, HÖHE);
		
		spieler.Zeichnen(g);
	}	// Zeichnen Ende

	
	
	private void Rendern()
	{
		Graphics g2 = this.getGraphics();
		g2.drawImage(image, 0, 0, null);
		g2.dispose();
	}

	private void Update() 
	{
		if(Tastatur.Knopfgedrückt(KeyEvent.VK_ESCAPE))running = false;
		
		spieler.Update(timeSinceLastFrame);
	}
	
}
```


----------



## Androbin (25. Apr 2015)

Es wurde "Active Rendering" angewandt, falls du das meintest.


----------



## InfectedBytes (25. Apr 2015)

Active Rendering und Double Buffering sind zwei verschiedene Dinge.

Ja das Double Buffering wurde angewandt, da erst einmal alles auf eine Textur (bzw. Image) gezeichnet wird und dann dieses Bild als ganzes auf dem Bildschirm ausgegeben wird.


----------



## Androbin (25. Apr 2015)

InfectedBytes hat gesagt.:


> Active Rendering und Double Buffering sind zwei verschiedene Dinge.


Das weiß ich auch, aber ich hatte gehofft, kingharun27 wüsste, das Swing von sich aus Double Buffering anwendet.


----------



## kingharun27 (25. Apr 2015)

Hmm was könnte ich denn am besten machen, damit es am besten gerendert und gezeichnet wird? 

Oder soll ich es so lassen?


----------



## Androbin (3. Mai 2015)

kingharun27 hat gesagt.:


> Hmm was könnte ich denn am besten machen, damit es am besten gerendert und gezeichnet wird?
> 
> Oder soll ich es so lassen?


Ich empfehle:
DoubleBuffering und Active Rendering in Java [Computerforum Wiki]


----------



## Major_Sauce (3. Mai 2015)

Man sollte vielleicht auch noch sagen dass es für ein Spiel keine akzeptable gameLoop ist.
Thread.sleep() ist nicht unbedingt genau, da werden ständig andere fps-zahlen rauskommen.

mfg Major


----------



## kingharun27 (3. Mai 2015)

Könntest du das bitte etwas näher erläutern?


----------



## kingharun27 (3. Mai 2015)

Major_Sauce hat gesagt.:


> Man sollte vielleicht auch noch sagen dass es für ein Spiel keine akzeptable gameLoop ist.
> Thread.sleep() ist nicht unbedingt genau, da werden ständig andere fps-zahlen rauskommen.
> 
> mfg Major



Könntest du das bitte etwas näher erläutern?


----------



## Major_Sauce (3. Mai 2015)

Natürlich,

Das was du da machst zieht folgendes nach sich:

Du machst ein sleep:


```
Thread.sleep(16)
```

nun Updatest du, das heißt zum Beispiel sowas:


```
if(moveRight.isPressed()){
    player.move(1, 0)
}
```

dann kommt eben der normale render-Vorgang, der spielt hier nun keine Rolle.

Wenn das oben beschriebene deiner Gameloop entspricht, dann heißt das, dass der Spieler in diesem Beispiel hier bei jedem update um eine Einheit bewegt wird, vorrausgesetzt der Mensch vor dem PC drückt die rechte Pfeiltaste.
Was ist denn nun wenn der Update aber erst nach 30 Millisekunden kommt, statt nach 16. Dies kann durchaus mal Passieren.
Das heißt nun dass der Spieler sich trotz längerem Abstand zum letzten Update genau so weit bewegt.
Wenn du nun ein Multiplayer spielst, wird folgendes Passieren:

Spieler 1 hat einen guten PC, bei ihm sind die 60 fps gar kein Problem.
Spieler 2 hat einen schlechten PC, der läuft mit durchschnittlich 40 fps, immer noch in Ordnung.

Das Problem ist nun aber dass Spieler 1 bei 60 fps natürlich 60 Einheiten weit bewegt wird, da er bei jedem update 1 Einheit verschoben wird.
Spieler 2 hingegen wird nur um 40 Einheiten bewegt, da er seltener updated.
Dadurch hat Spieler 1 natürlich einen Vorteil.

Ich hoffe du hast das einigermaßen verstanden.

Falls du das  mit dem Spiele programmieren ernst meinst kannst du dich mal bei mir melden, ich würde gerne mal ein größeres Spiel entwickeln, vielleich hast du ja Interesse.

mfg Major


----------



## kingharun27 (3. Mai 2015)

Ja ich danke dir und ich meine es auch ernst ich gucke sehr sehr viele Tutorials und habe schon Pong allein Programmiert , also nur mit Java Graphiken und bin grade dabei ein anderes Spiel zu programmieren ... 

Jetzt mal zu meinem Problem :


```
long lastFrame = System.currentTimeMillies();

while(true)
{
long thisFrame = System.currentTimeMillies();
float timeDiff = (float) (thisFrame - lastFrame)/1000;
lastFrame = thisFrame;
...
...
...

Sleep(15)...
...
}
```

Und dann jeweils


```
if(RECHTS)Pos_X += Speed * timeDiff;
```

Somit würd ich doch zuweisen wie viel Pixel die Figur in einer Sekunde mach Rechts verschiebt werden soll oder?

Könnte ich das so machen?


----------

