Verbrauchen Spielobjekte, die außerhalb der Kameraansicht liegen, Computer- / Mobilressourcen in Unity?

11

Nehmen wir in Einheit an, ich habe einige Spielobjekte in meiner Szene, die für die Kamera nicht sichtbar sind und daher nicht gerendert werden, während das Spiel läuft.

Verbrauchen diese Spielobjekte Computer- / Mobilressourcen, wenn das Spiel ausgeführt wird?

Wo finde ich Details zur Verwendung wie diese?

Gissipi_453
quelle

Antworten:

13

Was Sie wollen, ist ein Speicherprofiler, den Unity hat. Hier: http://docs.unity3d.com/Manual/ProfilerMemory.html

Aber Ihre Annahme ist meistens richtig, wenn ein gameObject für die Kamera nicht sichtbar ist, wird es nicht gezeichnet und verbraucht weniger Ressourcen, muss aber dennoch einige verbrauchen. Das gameObject ist weiterhin im Speicher vorhanden, einschließlich aller Texturen, Modellskripte usw. Es verbraucht weiterhin CPU-Zeit durch die Update- und FixedUpdate-Methoden (und verschiedene andere hier beschriebene ).

Normalerweise ist die Hauptverlangsamung das Zeichnen. Ein kleiner Teil der CPU-Zeit wird verwendet, um festzustellen, dass sich das Objekt außerhalb des Kamerastumpfs (Grenzen) befindet, aber es wird kein Zeichnen durchgeführt.

Reuben Crimp
quelle
5

Ich denke, Sie sollten auch etwas über Frustrum Culling oder das Entfernen von Oberflächen wissen: http://en.wikipedia.org/wiki/Hidden_surface_determination

Dies ist ein wichtiger Aspekt bei der Optimierung eines Spiels, da selbst wenn sich Ihre Objekte in einem bestimmten Frame nicht im Frustrum befinden (dh sichtbar sind), einige Draw Calls (Shader) für sie gestartet werden, wodurch die Leistung verringert wird.

Claudiu Apostol
quelle
2
@ Gissipi_453, während in dieser Richtung recherchieren, erforschen auch Quad- und Okt-Bäume (Geodatensortierung)
Jon
3

Die kurze Antwort lautet "Ja"; Alles, was für Ihr Spiel bereit ist, nimmt Speicherplatz in Anspruch.

Die andere zu berücksichtigende Sache sind die Kosten für Ihre Framerate:

5 Objekte mit 5 separaten Texturen, die separat gezeichnet werden, erfordern dazwischen Zustandsänderungen. Möglicherweise können Sie Speicherplatz sparen, indem Sie nicht verwendete Texturen entladen.

Durch Laden aller separaten Texturen in eine einzelne Atlas-Textur wird der Speicherbedarf festgelegt und Sie können eine einzelne Textur nicht mehr entladen. Einmal erstellt, müssen Sie den Atlas nur einmal binden, um alle Ihre Objekte zu zeichnen.

Ein weiteres Beispiel ist ein einfacher Scheitelpunkt- und Indexpuffer. Wenn viele der Punkte häufig zwischen sichtbar und nicht umschalten, ist es schneller, die "veralteten" Punkte im Scheitelpunktpuffer zu belassen und nur einen neuen Indexpuffer hochzuladen.

Es gibt viele andere Fälle, in denen erhöhte Speicherkosten im Voraus vielen Statusänderungen vorzuziehen sind.

Wenn Sie Ihre Kamera drehen, werden Sie diese Objekte definitiv nicht zerstören, es sei denn, Sie wissen, dass sich diese Kamera nicht zurück dreht, um dieses Objekt zu überprüfen. "- Katu

Wenn Sie am Beispiel eines Side-Scrollers nur nach rechts bewegen können (die Karte scrollt nur nach links), kann jedes Objekt, das von der linken Seite des Bildschirms rollt, dauerhaft entladen werden, da Sie es nie wieder verwenden werden. Darüber hinaus kann der Inhalt für Objekte direkt vor dem Scrollen in die Ansicht von rechts geladen werden.

Jon
quelle
1

Viele Antworten berücksichtigen hauptsächlich den grafischen Aspekt Ihrer Frage.

Tatsache ist, dass sie verschiedene Ressourcen beanspruchen und wie teuer sie im Vergleich zum Zeichnen des Objekts sind, ist nicht festgelegt. Es ist nicht so ungewöhnlich, wie einige Antworten implizieren, dass Ihre Komponenten teurere Vorgänge ausführen als das Zeichnen, aber Sie können den Ressourcenverbrauch minimieren. Denken Sie auch daran, dass ein GameObject wenig Speicherplatz beansprucht, ebenso wie seine Komponenten. Die Komponenten können auch Dinge tun, die ein gutes Stück Speicherplatz beanspruchen.

Der einfachste Weg, um die Auswirkungen von Off-Screen-Komponenten zu minimieren, ist ein System, das auf den Rückrufen OnBecameVisible und OnBecameInvisible basiert .

void OnBecameVisible()
{
    myComplexComponent.enabled = true;
}
void OnBecameInvisble()
{
    myComplexComponent.enabled = false;
}

Dies ist natürlich nur von sehr begrenztem Nutzen, da Sie häufig möchten, dass ein Objekt außerhalb des Bildschirms das Spiel beeinflusst. Sie können jedoch ein Muster dieser Art für ein feinkörniges System erweitern, mit dem die Auswirkungen Ihrer teuersten Berechnungen minimiert werden können. Selbst etwas so Einfaches wie das Verringern der Qualität eines Pfadverfolgungsskripts, wenn sich das Objekt außerhalb des Bildschirms befindet, kann auf lange Sicht zu großen Einsparungen führen.

Selali Adobor
quelle
1

Es benötigt Speicher, um am Leben zu bleiben und seine Position und andere Eigenschaften zu aktualisieren.

Es verbraucht jedoch keine Computer- / Mobilgrafikressourcen, da es nicht sichtbar ist.

Ja, es verbraucht zwar Speicherressourcen, aber keine Grafikressourcen wie ein sichtbares Spielobjekt.

Yohann V.
quelle
Danke vielmals. Dies ist eine sehr direkte Antwort, nach der ich gesucht habe.
Gissipi_453
0

Alles, was sich in einem Programm befindet, verbraucht Ressourcen. Sie glauben nicht, dass Programme nur auf Hoffnungen und Träumen beruhen, oder?

Die Frage sollte sein, wie viel Ressourcen ein Spielobjekt verbraucht, und zu diesem Zweck halte ich dies für eine ziemlich solide Antwort: http://answers.unity3d.com/questions/280455/how-much-memory-a-gameobject- verbrauchen.html

Kurz gesagt, sie verbrauchen selbst vernachlässigbare Ressourcen. Aber warum sollten Sie eine Reihe von Spielobjekten wollen, die nur in Ihrem Spiel sitzen und nichts tun? Letztendlich ist es das, was diese Spielobjekte tatsächlich "tun" lässt, was zu jeglichem Overhead führen wird - und wie viel Ressourcen, die benötigt werden, von Fall zu Fall sehr unterschiedlich sind.

return true
quelle
Vielen Dank. Soll ich also Objekte zerstören, die während des Spiels außer Sichtweite der Kamera sind?
Gissipi_453
1
Ich denke, diese Antwort versucht nicht wirklich, Ihre Frage überhaupt zu beantworten, und ist daher einfach falsch. Wenn Sie Ihre Kamera drehen, werden Sie diese Objekte definitiv nicht zerstören, es sei denn, Sie wissen, dass sich diese Kamera nicht zurückdreht, um dieses Objekt zu überprüfen. Spielwelten existieren und KI bewegt sich, Lichter beeinflussen die Umgebung, auch wenn Sie diese nicht sehen.
Katu
@ Katu, das ist auch ein Punkt. Vielen Dank. Wenn das Objekt überhaupt nicht gerendert werden muss, sollte ich es nicht zerstören.
Gissipi_453
@Katu Ich habe die Frage beantwortet: "Werden diese Spielobjekte (Objekte in meiner Szene, die für die Kamera nicht sichtbar sind) Computer- / Mobilressourcen verbrauchen, wenn das Spiel ausgeführt wird?" Diese Antwort lautet: "Ja. Alles, was sich in einem Programm befindet, verbraucht Ressourcen." Außerdem erläuterte ich die Auswirkungen leerer Spielobjekte auf die Szene und die Ressourcenkosten.
Rückgabe wahr
2
@ Gissipi_453 Um Ihre Frage zu beantworten, hängt dies vollständig davon ab, was die Spielobjekte in der Szene tatsächlich tun, wie oft sie erstellt / gelöscht werden und andere Überlegungen. Zu wissen, wann optimiert werden muss, ist eine Fähigkeit für sich, aber die Faustregel lautet, sich keine Sorgen zu machen, bis es etwas gibt, über das man sich Sorgen machen muss. Der Aufwand für zusätzliche Spielobjekte ist nahezu gleich Null. Machen Sie sich also keine Sorgen. In einigen Fällen kann das Zusammenlegen von Objekten ein Lebensretter sein, wenn Sie Objekte häufig hinzufügen / entfernen, und in anderen Fällen können Sie andere Tricks ausführen. Es hängt alles davon ab, ob es gibt und was genau das Problem ist.
Rückgabe wahr