Hi,
ich habe meine eigene Theorie zu dem Phänomen.
Da die Engine erst weiter macht wenn alle Threads fertig sind, ist diejenige zeit in der nur auf einen letzten Thread gewartet wird "verlorene" Zeit.
Je kleiner jeder Thread ist desto kürzer muss auf den letzten gewartet werden. Der Potenziell letzte Thread ist ja winzig, wie alle anderen.
Kann ich nicht sagen, da Horus' Aussagen sehr bruchstückartig sind und er irgendwie immernoch der Meinung ist, dass *wir* von *ihm* was lernen könnten.
Hä
Ähm Also ich will mich ja jetzt nicht Zittieren, aber ich habe oft betont dass ich keine Ahnung von dem habe was ich da mache. Ohne XNA kann ich nichtmal Grafik. Das betone ich hier gerne wieder
Ohne Fremde Hilfe aus diesem Forum hätte ich das nie hinbekommen.
Man müsste hier auch mal mit einem parallel-tauglichen Profiler rangehen und zum Beispiel herausfinden, ob die Threads wirklich alle beschäftigt sind
Ich habe die Engine in einer Console App vorab getestet. Es sind je nach CPU "nur so 4-8 Threads gleichzeitig aktiv.
Ich bezweifle, dass wir es hier mit 256 Threads zu tun haben, vermutlich wohl eher 256 WorkItems!?
Zeig bitte mal den Code, den du jetzt verwendest und wie genau du die Zeit misst.
Ja es sind natürlich 256 Woritems
Sorry.
Die Zeit messe ich in dem XNA Thread, der Update Methode, Die Engine ist ja in einem Separaten Thread.
|
C#-Quelltext
|
1
|
UpdatingTime = ((0.001f * (float)gameTime.TotalGameTime.Milliseconds)+(float)gameTime.TotalGameTime.Seconds + (60 * (float)gameTime.TotalGameTime.Minutes)) / SimulationEngine.Frame;
|
Der Engine Thread macht dauernd diese Schleife:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
while (RunEngine)
{
FinishedThreads = 0;
for (int i = 0; i < Config.InitThreads; i++)
ThreadPool.UnsafeQueueUserWorkItem(PhysicalSimulation, i);
while (FinishedThreads < Config.InitThreads)//Warten dass alle fertig werden //GEHT SO NICHT
System.Threading.Thread.Sleep(1);
FinishedThreads = 0;
for (int i = 0; i < Config.InitThreads; i++)
ThreadPool.UnsafeQueueUserWorkItem(CollisionDetection, i);
while (FinishedThreads < Config.InitThreads)//Warten dass alle fertig werden //GEHT SO NICHT
System.Threading.Thread.Sleep(1);
FinishedThreads = 0;
for (int i = 0; i < Config.InitThreads; i++)
ThreadPool.UnsafeQueueUserWorkItem(Walls, i);
while (FinishedThreads < Config.InitThreads)//Warten dass alle fertig werden //GEHT SO NICHT
System.Threading.Thread.Sleep(1);
Frame++;
}
|
Config.InitThreads ist auf 256.
FinishedThreads wird am Ende jedes Threads im Threadpool erhöht (interlocked)
Vielleicht nutze ich diesen Moment meine Frage von Vorher erneut zu stellen.
Wie kann ich das umgehen. Es wird unnötig gewartet.
|
C#-Quelltext
|
1
2
|
while (FinishedThreads < Config.InitThreads)//Warten dass alle fertig werden //GEHT SO NICHT
System.Threading.Thread.Sleep(1);
|
Suspend und Resume kann man nicht aus einem Thread aufrufen
Sie sind zudem Veraltet.
Mutex WaitHandle wäre auch schön aber ich muss dem Thread einen Parameter Übergeben. Dies gelingt nicht!
|
C#-Quelltext
|
1
|
ThreadPool.UnsafeQueueUserWorkItem(PhysicalSimulation, i);
|
habe ich mit WaitHandle probiert als
|
Quellcode
|
1
|
ThreadPool.UnsafeQueueUserWorkItem(new Waithandle (PhysicalSimulation), waitHandle);
|
für den Parameter i ist kein Platz mehr
Wie soll es aber dann gehen?
LG