Probleme mit Threads!

dapor

Mitglied
Hi,

ich habe ein kleines Problem mit Threads und das sie gleichzeitig und am besten synchronisiert ablaufen.

Ich habe ein kleines Bomberman Spielchen entwickelt und stehe nun vor folgendem Problem:

Das Frame soll alle 25 millisekunden aktualisiert werden, damit ich um die 40 FPS habe.
Und die Spieler sollen alle 20 Millisekunden neu "denken" und somit bestimmen wo sie langgehen und was sie machen.

Bis jetzt habe ich das folgendermaßen im gamePanel umgesetzt:
Code:
private static final int 	INCTIME 			= 20;

...

public void run()
{
	long 		time2	= System.currentTimeMillis();
	
	while ( this.bThread )
	{
		int cnt = 0;
		while ( ( time2 < System.currentTimeMillis() ) && ( cnt + 1 < 5 ) ) 
		{
			time2 		+= INCTIME;
			this.time	+= INCTIME;
			this.think( INCTIME );
			cnt = cnt + 1;
		}
		this.bM.setRepaint();
		try
		{
			Thread.sleep( 25 );
		} catch (InterruptedException e) 
		{
			break;
		}
	}
}

Ein Problem ist einerseits, dass dieses System.currentTimeMillis() sehr ungenau in 15 bis 16 Ms Schritten arbeitet.
Desweiteren sollen die Spieler ja gleichzeitig aufgerufen werden (also alle 20) und ich rufe sie zur Zeit in der think() Methode auf und starte sie so sehr knapp Zeitversetzt mit Hilfe eines einfachen Befehls.
In der Player Klasse habe ich das folgendermaßen implementiert: die Methode setStart wird im GamePanel während der think() Methode aufgerufen

Code:
protected void setStart()
{
	if ( this.bThread == true )
	{
		return;
	}
	this.bThread	= true;
	Thread t	= new Thread( this );
	t.start();
}
	
public void run()
{
	boolean bThink 	= false;
	bThink		    = this.think();
	try
	{
		Thread.sleep( 20 );
	} catch (InterruptedException e)
	{
		e.printStackTrace();
	}
	if ( bThink == false )
	{
		this.bAlive = false;
	}
	this.bThread = false;
}

Jetzt die Frage nochmal kurz und knapp: Wie schaffe ich es, dass die Spieler gleichzeitig denken können und wie schaffe ich es das sie alle nur 20 Millisekunden zum denken haben (die sich aber nicht auf die FPS auswirken).
Ich hoffe ihr habt meine Frage verstanden.
Ich danke für jede Hilfe!
 
Hallo!

Die Auflösung von System.currentTimeMillis() ist stark Abhängig vom Betriebsystem und beträgt bei Windows XP wie du richtig beobachtet hast bei 15ms. Wenn du Java 5 benutzt, solltest du besser System.nanoTime() verwenden. Das ist ein hochauflösender Timer, der die gewünschte Genauigkeit bietet. Wenn du dennoch mit Java 1.4 arbeiten musst solltest du dir mal den gagetimer an:
http://java.dnsalias.com/

Gruß Tom
 
Zurück