Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat
List<T> Container waren bei meinen Tests erheblich! langsamer als Arrays :/
Zitat
Mit den Threads klappt nicht wie gewollt gerade
Zitat
Ist das nicht der richtige Ansatz?
C#-Quelltext |
|
1 2 3 |
Engine Engine = new Engine(); Thread EngineThread = new Thread(new ThreadStart(Engine.Start)); EngineThread.Start(); |
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 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
public class Engine { const int InitThreads = 8; int FinishedThreads = 0; int Frame; bool RunEngine = false; private List<Thread> Threads; public void Start()//Startet die Engine { Threads = new List<Thread>(); if (RunEngine) return; else { Frame = 0; RunEngine = true; EngineLoop(); } } public void Cancel()//Schließt die Engine { RunEngine = false; } private void EngineLoop() { while (RunEngine)//Hier ist die Dauerschleife für die Engine { FinishedThreads = 0; //Kein Thread ist fertig for (int i = 0; i < InitThreads; i++) { Thread temp = new Thread(PhysicalSimulation); //Alle threads starten Threads.Add(temp); temp.Name = String.Format("Thread [{0}]", i); Console.WriteLine("START: {0}" , i.ToString()); temp.Start(i); } while (FinishedThreads < InitThreads) //Auf alle Threads warten System.Threading.Thread.Sleep(1); Threads.Clear();//Frame fertig, Liste muss sauber werden. Frame++; Console.WriteLine("==== Frame: {0} Finished ====", + Frame); } Console.WriteLine("Exit Engine"); } private void PhysicalSimulation(Object o)//Wird später Partikelphysik berechnen { int n; n = (int)o; //CountSeparate[n] = 0; for (int i = 0; i < (10000000 / InitThreads); i++) { double d = Math.Sqrt(100000000000); //Irgendwas tun! //Die Wurzel wird hier noch ganz oft gezogen, damit es etwas dauert! } FinishedThreads++; //Fertige Threads hochzählen Console.WriteLine(" END: {0}" , n.ToString()); } } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
START: 0 START: 1 START: 2 START: 3 END: 2 END: 1 START: 4 END: 0 START: 5 END: 3 START: 6 END: 4 START: 7 END: 5 END: 6 END: 7 ==== Frame: 3 Finished ==== |
Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von »Horus« (06.11.2012, 08:52)
Administrator
Zitat
Das ist unnötig und kostet Zeit.
Administrator
C#-Quelltext |
|
1 2 3 4 5 6 |
FinishedThreads = 0; for (int i = 0; i < InitThreads; i++) ThreadPool.QueueUserWorkItem(PhysicalSimulation, i); while (FinishedThreads < InitThreads)//Warten dass alle fertig werden System.Threading.Thread.Sleep(1); |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Horus« (06.11.2012, 12:38)
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Enginethread starting START: 0 END: 0 All Threads Finished in: 5.662 START: 0 END: 0 All Threads Finished in: 5.647 START: 0 END: 0 All Threads Finished in: 2.28 START: 0 END: 0 All Threads Finished in: 5.678 START: 0 END: 0 All Threads Finished in: 2.28 START: 0 Exit Signal recieved END: 0 All Threads Finished in: 5.725 Exit Engine |
C#-Quelltext |
|
1 |
ThreadPool.UnsafeQueueUserWorkItem() |
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Horus« (06.11.2012, 13:38)
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Horus« (06.11.2012, 18:48)
C#-Quelltext |
|
1 2 |
while (FinishedThreads < Config.InitThreads)//Warten dass alle fertig werden //GEHT SO NICHT System.Threading.Thread.Sleep(1); |
Werbeanzeige