Unity3D: Optimierung garbage collection
Unity3D Profiler gibt mir die Spitzen, die meist über die garbage collection. In der Abbildung unten sehen Sie die drei roten Spitzen stellen die drei Stände, die hatte ich in meinem gameplay. Jeder dieser Stände sind 100+ms und die meiste Zeit wurde damit verbracht, auf TrackDependencies
.
Laut Einheit Unterricht, ich habe versucht, das hinzufügen dieser zu meinem code:
if (Time.frameCount % 30 == 0)
{
System.GC.Collect();
}
Nicht helfen. Ich habe noch spikes, und Sie immer noch 100+ms. Was genau ist passiert und was kann ich tun, um die Optimierung meines Spiels?
PS:
Ich bin dynamisch erstellen und zerstören eine Menge GameObject
s in meinem Spiel. Könnte das ein problem sein?
Habe ich nicht die string-Verkettung in einer Schleife oder Arrays als return-Wert als caveated in die post.
Wenn möglich, ist eine Bündelung der Objekte zu vermeiden übermäßige Zerstörung könnte eine gute Lösung sein.
Ja, ich bin dynamisch erstellen und zerstören eine Menge von Objekten, die in meinem Spiel. In meinem Zerstöre-Objekt-Funktion, die ich auch als
Resources.UnloadUnusedAssets();
InformationsquelleAutor CherryQu | 2013-07-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
System.GC.Collect
sind Sie einfach zu zwingen, eine garbage collection. Wenn Sie zugewiesen haben, eine Menge Speicher freigegeben, von den letzten zu sammeln, als Sie nicht Spitzen zu vermeiden. Dies ist nur nützlich, um zu versuchen, zu verteilen garbage collection im Laufe der Zeit zu vermeiden eine massive Freigabe.Wahrscheinlich ist dies das problem sein könnte.
Einige Hinweise:
LoadResource
undInstantiate
) so viel wie möglich von Ihrer Ressourcen zu Beginn von Sie Anwendung. Wenn der Speicherbedarf ist nicht zu viel, Sie kann einfach erzeugen alle Ressourcen, die Sie benötigen, und aktivieren/deaktivieren Sie auf Nachfrage. Wenn die Ressource Speicher Anforderungen sind riesig dies ist nicht erreichbar.Instantiate
undDestroy
. Erstellen Sie eine pool von Objekt, wo Sie eine Reihe von Ressourcen Instanziiert wird, wenn die Anwendung gestartet wird. Aktivieren Sie die Ressourcen, die Sie benötigen, und deaktivieren Sie alle anderen. Stattdessen zerstören Sie ein Objekt freigeben, um den pool, so dass es deaktiviert werden kann und reanabled auf Nachfrage.Resources.UnloadUnusedAssets
. Das kann nur die Zeit verlängern, die erforderlich ist, um zu Instanziieren, eine neue Ressource, wenn Sie zuvor loslassen. Es ist nützlich, um opitmize Speichernutzung, aber ruft es in Konstanten Zeitintervallen oder jedes mal, wenn Sie zerstören ein Objekt keinen Sinn macht.InformationsquelleAutor Heisenbug