Hallihallo,
Ich habe ein sehr merkwürdiges Problem wo ich echt nicht weiß wie das zustande kommt.
Ich habe eine Simulation die im Main Thread abgearbeitet wird. Dann habe ich zusätzlich ein JFrame dessen BufferStrategy ich an meinen Zeichenthread weitergebe. Der Zeichenthread ist nun alleine für das zeichnen der Simulationsergebnisse verantwortlich - das Zeichnen über den AWT Thread habe ich auf Grund schlechter Kontrollmöglichkeiten ausgeschlossen.
Hier nun die run Methode des Zeichen Threads:
Die interne while Schleife soll dabei erzwingen das nur einmal pro Iterationsschritt gezeichnet wird (weil öfters wäre unnütz)
Soweit so gut. Funktioniert auch alles wunderbar. Der Witz ist:
wenn ich das
einkommentiere gibt es einen sehr großen Unterschied in der Zeichengeschwindigkeit. x wird dabei nirgendwo sonst verwendet, weder gelesen noch geschrieben.
mit der int Variable: er kommt in die interne while Schleife und spult diese so lange ab bis zur nächsten Simulationsiteration - dann zeichnet er und das ganze von vorne. Die Darstellungsgeschwindigkeit ist hierbei recht angenehm. Und da er so ziemlich in jedem Iterationsschritt in die While Schleife kommt gehe ich davon aus das er für das Zeichnen weniger Zeit braucht als für die Simulation
ohne die int Variable: Er geht niemals in die interne while Schleife hinein (nur ganz am Anfang als die Simulation noch am initiieren ist) - später aber garnicht mehr und ist die ganze Zeit am zeichnen. das Zeichnen ist nicht besonders angenehm mit anzusehen da er so auch Bilder aus mehreren Simulationsschritten in einer Darstellung vereint (was aber grundsätzlich nicht so schlimm ist) - das Hauptproblem ist halt das das Zeichnen sehr unangenehm langsam wird.
Wenn ich jetzt den sleep Befehl aus der While Schleife entferne dann ist es auch ohne int Variable vernünftig lauffähig nur ist dann die Auslastung der CPU bei weitem höher weil sie ja nicht IDLE läuft sondern die ganze Zeit NICHTS tut - verwunderlich da er ja ohne die int Variable eigentlich erst garnicht in die While Schleife reingeht und somit auch das entfernen des Sleeps nichts ändern sollte.
Es findet sonst keine Synchronisation mit dem Simulationsthread statt - dies ist so beabsichtigt falls die Frage aufkommt.
Irgendwer ne Idee woran das liegen könnte? Weißt echt nicht woran das liegen könnte und die (ansich sinnlose) Int Variable möchte ich auch nicht drinne lassen geschweige denn das Sleep entfernen.
Als Hinweis: CPU i7 920 - also vernünftig für Multithreaded. Läuft auf Win XP
Ich habe ein sehr merkwürdiges Problem wo ich echt nicht weiß wie das zustande kommt.
Ich habe eine Simulation die im Main Thread abgearbeitet wird. Dann habe ich zusätzlich ein JFrame dessen BufferStrategy ich an meinen Zeichenthread weitergebe. Der Zeichenthread ist nun alleine für das zeichnen der Simulationsergebnisse verantwortlich - das Zeichnen über den AWT Thread habe ich auf Grund schlechter Kontrollmöglichkeiten ausgeschlossen.
Hier nun die run Methode des Zeichen Threads:
Java:
public void run()
{
int timeCounter = _simulation.getTimeCounter();
int counter = 0;
while (!this.interrupted())
{
//HIER WIRD GEZEICHNET
//...
//<-
//******
//int x ;
//******
while (timeCounter == _simulation.getTimeCounter())
{
counter ++;
System.out.println(counter);
try
{
Thread.sleep(1);
}
catch (Exception e)
{
}
}
timeCounter = _simulation.getTimeCounter();
}
}
Die interne while Schleife soll dabei erzwingen das nur einmal pro Iterationsschritt gezeichnet wird (weil öfters wäre unnütz)
Soweit so gut. Funktioniert auch alles wunderbar. Der Witz ist:
wenn ich das
Java:
int x;
mit der int Variable: er kommt in die interne while Schleife und spult diese so lange ab bis zur nächsten Simulationsiteration - dann zeichnet er und das ganze von vorne. Die Darstellungsgeschwindigkeit ist hierbei recht angenehm. Und da er so ziemlich in jedem Iterationsschritt in die While Schleife kommt gehe ich davon aus das er für das Zeichnen weniger Zeit braucht als für die Simulation
ohne die int Variable: Er geht niemals in die interne while Schleife hinein (nur ganz am Anfang als die Simulation noch am initiieren ist) - später aber garnicht mehr und ist die ganze Zeit am zeichnen. das Zeichnen ist nicht besonders angenehm mit anzusehen da er so auch Bilder aus mehreren Simulationsschritten in einer Darstellung vereint (was aber grundsätzlich nicht so schlimm ist) - das Hauptproblem ist halt das das Zeichnen sehr unangenehm langsam wird.
Wenn ich jetzt den sleep Befehl aus der While Schleife entferne dann ist es auch ohne int Variable vernünftig lauffähig nur ist dann die Auslastung der CPU bei weitem höher weil sie ja nicht IDLE läuft sondern die ganze Zeit NICHTS tut - verwunderlich da er ja ohne die int Variable eigentlich erst garnicht in die While Schleife reingeht und somit auch das entfernen des Sleeps nichts ändern sollte.
Es findet sonst keine Synchronisation mit dem Simulationsthread statt - dies ist so beabsichtigt falls die Frage aufkommt.
Irgendwer ne Idee woran das liegen könnte? Weißt echt nicht woran das liegen könnte und die (ansich sinnlose) Int Variable möchte ich auch nicht drinne lassen geschweige denn das Sleep entfernen.
Als Hinweis: CPU i7 920 - also vernünftig für Multithreaded. Läuft auf Win XP