Double Buffering angewendet?

kingharun27

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

Java:
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);
	}
	
}
 

InfectedBytes

Top Contributor
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.
 

Major_Sauce

Bekanntes Mitglied
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
 

Major_Sauce

Bekanntes Mitglied
Natürlich,

Das was du da machst zieht folgendes nach sich:

Du machst ein sleep:

Java:
Thread.sleep(16)

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

Java:
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

Mitglied
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 :

Java:
long lastFrame = System.currentTimeMillies();

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

Sleep(15)...
...
}

Und dann jeweils

Java:
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?
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben