Jump to content
Unity Insider Forum

Multithreading in Unity


Kokujou

Recommended Posts

Hi!

Ich bin gerade dabei mein Schachprogramm von VisualStudio in Unity zu importieren. vieles ist schon geschafft aber jetzt macht mir das Multithreading Probleme

 

In VisualStudio hab ich Tasks benutzt. Ich weiß in Unity gibt es Coroutinen die mir auch besser gefallen aber mir fehlen einige wichtige Funktionen. Ich führer hunderte vielleicht tausende Tasks gleichzeitig aus und Coroutinen haben keine WaitAll Methode.

 

also wie realisiere ich die WaitAll Methode mittels Coroutinen? Es ist immens wichtig dass alle Threads gleichzeitig laufen!

 

Danke schonmal!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Coroutinen sind keine Threads.

Die werden alle im Mainthread aufgerufen.

 

Das einzige was Unity macht ist auszunutzen das Funktionen "pausiert" werden sobald etwas mit yield return zurückgegeben wird.

Trotzallem werden die Coroutinen nur gespeichert und nacheinander im Mainthread aufgerufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Coroutinen sind keine Threads.

Die werden alle im Mainthread aufgerufen.

 

Das einzige was Unity macht ist auszunutzen das Funktionen "pausiert" werden sobald etwas mit yield return zurückgegeben wird.

Trotzallem werden die Coroutinen nur gespeichert und nacheinander im Mainthread aufgerufen.

 

das ist unschön... und wie realisiert man dann multithreading in Unity?

Link zu diesem Kommentar
Auf anderen Seiten teilen

So wie du bereits zuvor vorgegangen bist.

Der einzige Unterschied ist, du darfst keine Methoden von Unity benutzen weil die nicht Threadsafe sind.

 

Aber niemand hindert dich daran im Hintergrund alles per Threads zu berechnen und dann an einem Punkt die Ergebnisse dann an Unity "weiterzuleiten"

Link zu diesem Kommentar
Auf anderen Seiten teilen

Unity unterstützt aber keine Tasks. Unity hat offenbar noch kein Net 4.5 oder 4.0, keine ahnung welche Version Threading.Tasks namespace ist. :(

und normale Threads haben keine Waitall Methode.

 

Und es ist vor allem komisch! Ich hab gerade mal gesucht und die System.Threading.Tasks DLL gefunden undzwar im Mono verzeichnis. Was soll das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich verstehe dein Problem mit Threads nicht so ganz. Du kannst mit IsAlive nachschauen, ob er noch arbeitet, und mit Join() den ausführenden Thread blockieren, bis der andere Thread fertig ist.

 

Da du in Unity vermutlich weniger blockieren willst, kannst du wunderbar mit IsAlive warten:

private Thread thread;

public void StartDoingStuff()
{
 thread = new Thread(new ThreadStart(DoStuff));
 thread.Start();
}

void Update()
{
 if(thread != null && !thread.IsAlive)
 {
   print("Thread ist fertig!");
   thread = null;
 }
}

 

Kann man auch wunderbar in eine Coroutine bauen, dazu habe ich auch mal eine praktische Klasse gepostet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja ich kenn mich mit Threads nicht wirklich aus. Darum kannte ich die funktionen nicht. Ich weiß nur bei Tasks rufst du einfach den Task auf, der wohl nichtmal statisch sein muss, rufst danach Waitall für das Array von Tasks auf und wartest so bis jeder fertig ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier hast du eine Erklärung der Unterschiede. Tasks sind schon vorteilhaft, existieren aber scheinbar erst ab .NET 4. Von daher sieht's mit der Verwendung in Unity nicht allzu prickelnd aus (obwohl sie ja Prototypen für aktuelle .NET-Versionen haben).

 

Wenn du Threadpooling haben willst, gibt's auch ohne Tasks die Threadpool-Klasse.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt mal ernsthaft. Wann glaubst du kann ich auch mit Net 4.x Builden?

Nächsten Monat sollte das Programm endlich fertig sein und da sollte es buildbar sein. Soll ich auf diese Weise weiterarbeiten? Oder soll ich lieber Threads statt Tasks verwenden und auf nummer sicher gehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...