Ich habe versucht, aber es scheint wie meine ui immer noch hinter gc.collect zurückbleiben. Ist es möglich zu tun? Gibt es einen Trick, es zu tun? Der Hauptzweck ist es, die Verzögerung zu reduzieren, während gc.collect automatisch ausgeführt wird.Kann ich gc collect auf einem anderen Thread als dem Haupt-Thread in Unity3D ausführen?
Antwort
Nur von C# 4.5 können Sie eine non-blocking garbage collection durchführen.
Es spielt also keine Rolle, welchen Thread Sie aufrufen, sammeln Sie mit Unity (Mono-Version sollte C# 3 oder 3.5 entsprechen, wenn ich mich richtig erinnere).
Es ist eine gute Praxis zu avoid so viel wie möglich Laufzeitzuweisung.
Sie können eine Garbage-Collection regelmäßig manuell auslösen, um Spikes zu vermeiden.
Das wird Ihr Problem nicht lösen. Die Lösung besteht darin, während des Spiels keinen Speicher zuzuweisen. Verwenden Sie stattdessen das Objektpooling. Beim Objektpooling werden Sie die GameObjects erneut verwenden, anstatt sie zu instanziieren und zu zerstören.
EDIT:
Unity 2017 unterstützt C# 4.5, so dass Sie dies jetzt tun können, aber nach wie vor, die richtige Lösung ist Object Pooling zu nutzen. Auf diese Weise müssen Sie GC.Collect
at-all nicht anrufen.
- 1. Ausführen von Code auf dem Hauptthread von einem sekundären Thread?
- 2. Android, Handler läuft im Hauptthread oder in einem anderen Thread?
- 3. RSS auf einem anderen Thread funktioniert nicht, aber funktioniert gut, wenn auf dem Hauptthread
- 4. In RxJava, kann gezippte Observable zum Hauptthread zurückkehren, wenn es auf dem anderen Thread abonniert hat?
- 5. Wie kann ich den Fehler "von einem anderen Thread als dem Thread, auf dem er erstellt wurde" aufrufen?
- 6. Android: Kann AsyncTask in einem anderen Thread als UI-Thread zurückgegeben werden?
- 7. 'NSInternalInconsistencyException', Grund: 'Nur auf dem Hauptthread ausführen!' Fehler
- 8. Kann ich eine Methode für den Haupt-Thread von einem separaten Thread ausführen?
- 9. AscyncTask - Nicht auf dem Hauptthread
- 10. Std :: Thread erkennen Hauptthread
- 11. Wie poste ich Code, der auf dem Android-Hauptthread von einem separaten Thread in C++ ausgeführt werden soll?
- 12. Ausführen einer Funktion in einem anderen Thread in QT
- 13. Unbehandelte Ausnahmen in einem Thread im Hauptthread auslösen?
- 14. Ausführen von SQLite-Operationen in einem anderen Thread
- 15. Führen Sie Code im Hauptthread von einem Worker-Thread aus
- 16. C#: Wie eine Methode aus dem Haupt-Thread erzwingen „Aufruf“ von von einem anderen Thread
- 17. Wie Sprite auf einem anderen Sprite in Unity3d?
- 18. Update ListView im Haupt-Thread von einem anderen Thread
- 19. Wenn ich Speicher in einem Thread in C++ zuweisen kann, kann ich es in einem anderen
- 20. Wie rufe ich eine Funktion auf den Haupt-Thread von einem anderen Thread in Vb
- 21. Wie stoppe ich einen Thread von einem anderen Thread
- 22. GHC pro Thread GC-Strategie
- 23. Wie führe ich io_service in einem anderen Thread aus?
- 24. Für pthread, wie Kind Thread aus dem Hauptthread zu töten
- 25. Wie kann ich Code auf einem Hintergrund-Thread auf Android ausführen?
- 26. Wie kann ich einen Java Thread von einem anderen stoppen?
- 27. Ausführen von SolrCloud auf einem anderen Computer
- 28. Zugriff auf JavaFX-Anwendung Thread aus einem anderen Thread
- 29. Stop Thread von anderen Thread
- 30. Kann UI auf Hauptthread nicht aktualisieren
Objekt-Pooling ist zwar eine gute Annäherung, aber leider nicht immer möglich. Unity 2017.1 zur aktuellen Version 2017.2 unterstützt C# 4.5, befindet sich jedoch noch in einem experimentellen Zustand und sollte mit Vorsicht verwendet werden. – Acimaz
@Acimaz Es heißt "Experimental", weil es auf einigen Plattformen noch nicht implementiert ist. 4.5 wurde vor mehr als einem Jahr ausgiebig getestet, bevor es dieses Jahr veröffentlicht wurde. Ich war einer der ersten Tester, daher sollte es bei der Verwendung keine Vorsicht geben. Dieses "Experiment" -Wort ist einfach da, also werden die Leute nicht die Einheit beschuldigen, wenn sie bei der Verwendung des Elements auf Probleme stoßen. Es funktioniert ohne Probleme. Sag mir, wo es nicht möglich ist, Objekt-Pooling zu verwenden. – Programmer
Ja, du hast Recht mit der "experimentellen" Sache. Wurde darüber falsch informiert. Gut zu wissen, obwohl! Was das Objekt-Pooling betrifft: Als Entwickler sollte man wissen, dass es zu viele Möglichkeiten gibt und ich kann Ihnen kein Beispiel vorstellen, in dem es nicht möglich wäre, was Ihnen als Antwort genügen würde. Aber ich bin mir sicher, dass es Projekte gibt, die kein Pooling verwenden und jetzt nicht in der Lage sind, dies aufgrund von Spaghetti-Code, Zeitproblemen usw. zu ändern, mit denen Sie als Entwickler arbeiten müssen. Und deshalb habe ich gesagt, dass es nicht "immer" möglich ist. – Acimaz