Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Programmunterbrechung für eine bestimmte Zeit (Millisikunden
Gibt es eine Funktion mit der ich das Programm bzw. die Abarbeitung für eine bestimmte Zeit (im Millisekundenbereich) unterbrechen kann?
speziell geht es darum, daß das Program immer eine pause von einer bestimmten Zeit machen soll, bevor es den nächsten String über die serielle Schnittstelle sendet.
Ich habe schon an eine einfache Schleife gedacht, aber das ist mir nicht "allgemein" genug. das Programm soll auch auf anderen Rechnern ja laufen (anderen Taktraten).
Das kann ich mir nicht vorstellen, wenn dein Spielchen nicht gerade Bilder per
Animation darstellen oder animierte Landschaften berechnen mußt die
bei einer Bildauflösungsfrequenz von 25 Bildern pro Sekunde (= 40 ms / Bild)
dargestellt werden müssen.
Wahrscheinlicher liegts an einem ganz anderen Fehler. ???:L
Ich hab mal noch n bissl mit Thread.sleep rumprobiert, und hab n paar interessante Ergebnisse bekommen.
Ich hab diesen Loop hier:
Code:
private static final long FAVORITE_TIME = 10;
public void loop()
{
bufferImage = createVolatileImage(GAME_FIELD_WIDTH, GAME_FIELD_HEIGHT);
long t;
while(true)
{
t = System.currentTimeMillis();
mouse.handleMouse();
ball.act();
paintOffscreen();
paintOnscreen();
for(int i=0 ; i<blockList.size() ; i++)
{
Block b = blockList.get(i);
if(b.getLifes() <= 0
&& !b.isPaintingHitAnimation())
{
blockList.remove(i);
i--;
}
}
try
{
long workTime = System.currentTimeMillis()-t;
long waitTime = FAVORITE_TIME - workTime;
if(waitTime > 0) Thread.sleep(waitTime);
long loopTime = System.currentTimeMillis()-t;
System.out.println("workTime: "+workTime+"ms "+"waitTime: "+waitTime+"ms "+
"LoopTime: "+loopTime+"ms");
}
catch(InterruptedException e)
{
System.out.println("InterruptedException");
}
}
}
Da ich ja nun 10ms warte, bzw warten möchte, und in jedem Loopdurchlauf einmal der Bildschirm erneuert wird, hatte ich damit gerechnet relativ konstant 100 FPS zu erhalten. Ich hatte 64, was sich auch in dieser Ausgabe wierspiegelt:
dennoch eine Gesamtzeit von 15-16 ms. Allerdings scheinbar weniger stabil.
Nur wenn ich überhaupt nicht warte, bekomme ich höre Frameraten (ca. 500-700 FPS) als die 64FPS hier.
Allerdings natürlich auch ne Systemauslastung von 95%.
Wie kann ich eine Loopzeit von 10ms einstellen wenn Thread.sleep so mieserabel funktioniert, bei solch kleinen Werten? Hat da jemand ne Idee? :bahnhof:
PS.: Timer hab ich auch mal probiert, aber die sind ja vom Prinzip her nichts anderes, und von daher zeigt sich natürlich fast das selbe (bischen schlechter) Bild.
Danke für die Antwort, also bist du der Meinung dass nicht Thread.sleep ungenau ist, sondern die Methode currentTimeMillis?
Dann werd ich des mal alles Umschreiben auf nanoTime, und meine Ergebnisse nochmal posten. Das wär ja n starkes Stück, wenn das eigentlich daran liegt. Ausserdem werde ich das auf meinem Panel ausgeben um den Weg zur Konsole zu vermeiden.
Die Frames messe ich in der paintOnscreen-Methode:
Code:
private void paintOnscreen()
{
long t = System.nanoTime();
if(t >= (time+1000000000))
{
fps =(int) (((double)frame*1000000000/(System.nanoTime()-time)));
time = System.nanoTime();
frame = 0;
}
do
{
int returnCode = bufferImage.validate(getGraphicsConfiguration());
if (returnCode == VolatileImage.IMAGE_RESTORED)
{
// Contents need to be restored
paintOffscreen(); // restore contents
}
else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE)
{
// old bufferImage doesn't work with new GraphicsConfig; re-create it
bufferImage = createVolatileImage(GAME_FIELD_WIDTH, GAME_FIELD_HEIGHT);
paintOffscreen();
}
this.getGraphics().drawImage(bufferImage, 0, 0, this);
}
while ( bufferImage.contentsLost());
this.getGraphics().drawImage(bufferImage, 0, 0, this);
frame++;
}
Den String hab ich nun einmal pro sec auf dem Bildschirm ausgegeben und zwecks im Forum posten in ner Liste gespeichert, die ich beim verlassen auf der Konsole ausgegeben habe:
Thread.sleep läßt den Thread anscheinend nicht ganz so lang schlafen wie es das sollte. Bzw, zu lange, denn rauskommen sollte eigentlich eine LoopTime von 10000. Ca. 2/3 der Zeit dauert ein Loop 7,8 ms und ein 1/3 15,6 ms.
Was mir unerklärlich erscheint ist, wieso die FPS stabil bleiben, egal wie lang der Loop tatsächlich gedauert hat. ???:L