Wie Spiele ein Objekt in der Datenbank löschen, es aber gleichzeitig animieren

8

Ich frage mich, wie asynchrone Aktionen wie Animationen funktionieren, wenn Sie Aktionen wie das Löschen eines Elements ausführen, und so einen Denkprozess entwickelt haben und Feedback wünschen, um zu sehen, ob dies aus Sicht der branchenüblichen Praxis sinnvoll ist / p>

Es gibt zwei Ebenen:

  • Die reaktive Schicht.
  • Der Rendering-Layer.

Die reaktive Schicht tritt sofort auf und kann mit herkömmlicher Ereignisverteilung durchgeführt werden.

Hier erstellen und löschen Sie Daten und alles geschieht sofort.

Der Zustandsautomat wird über diese sofortigen reaktiven Änderungen benachrichtigt.

Dann "wechselt" die Zustandsmaschine. Dieser Prozess tritt über einen Zeitraum auf, vorausgesetzt, dass einige asynchrone Dinge auftreten (Animationen, Netzwerkanforderungen usw.). Das ist es, was Leute meinen, wenn sie "Aktionswarteschlange" sagen.

Dann pickt der Rendering-Layer die Aktionswarteschlange ab und rendert sie. Auf diese Weise gibt es eine Art verzögerte Reaktion auf die zugrunde liegende sofortige reaktive Schicht.

Meine Frage ist, ob der reaktive Layer auch Async verarbeiten soll. Zum Beispiel, etwas zu löschen.

Sagen Sie, ein Element wurde gelöscht und Sie möchten es animieren. Es gibt einige Möglichkeiten, dies zu tun:

  1. Bringe eine Löschaktion in die Warteschlange und animiere sie dann zuerst. Wenn die Animation abgeschlossen ist, führen Sie das tatsächliche Löschen durch. Wenn die Animation unterbrochen wird (Löschen abbrechen), wird das Löschen nie durchgeführt.
  2. Löschen Sie das Element sofort (reaktive Ebene). Die Animationsebene behält einen Verweis auf das Objekt herum, kann also trotzdem seine Animation machen, obwohl sie vom globalen Ort gelöscht wird. Wenn die Animation abgebrochen wird, müssen Sie etwas "rückgängig machen" machen, das komplexer ist.

Wenn (1) der richtige Weg ist, dann gibt es keine reaktive Schicht, und alles wird mit einer Art Aktionswarteschlange implementiert. Dies erschwert die Erstellung von wiederverwendbarem Code, da alles an die Aktionswarteschlangen-Idee gebunden ist.

Wenn (2) der richtige Weg ist, dann gibt es zwei Kopien der Daten, die globale Kopie und die lokale Kopie, die asynchron synchron gehalten wird. Dies macht es einfacher, wiederverwendbaren Code zu verwenden, macht es jedoch komplizierter, darüber nachzudenken.

Ich frage mich, ob das überhaupt Sinn macht und ob einer dieser Ansätze in der Branche besser ist (oder wenn es eine Alternative gibt, die ich nicht angesprochen habe, die mehr Sinn ergibt).

Anders gesagt, gibt es zwei Möglichkeiten, dies zu tun:

  1. Eifrig: Löschen Sie es jetzt, okay, alle, wir haben es gelöscht, Zeit, wieder reinzukommen. Und warte darauf, dass alles wieder in Ordnung kommt, um es "fertig" zu sagen.
  2. Vorsichtig: Kündigen Sie "Wir werden es löschen", warten Sie, bis alles erledigt ist, und kehren Sie zurück, um das Löschen tatsächlich durchzuführen.

Ich frage mich, wie Spiele und Apps und so etwas handhaben.

Aktualisieren

Nachdem ich anders darüber nachgedacht habe, wäre es vielleicht eher wie das Schwingen von Seetang im Ozean:

Ссылка

Damit meine ich, dass es einen Basis-Layer gibt, der direkt ist (erstellt / löscht), dann gibt es einige Zwischen-Layer mit Kopien aller Transaktionen (create / delete), die der Rendering-Layer verwendet animieren erstellen / löschen. Die Originaldaten sind also immer synchron, aber der Rendering-Layer verwendet eine Art ältere Version der Daten mit einer Kette aller stattfindenden Änderungen.

reaktive Schicht - & gt; Transaktionsschicht - & gt; Rendering-Ebene.

Eine andere Option ist das Löschen als Löschen. Erst nach dem Abschluss der Animationen wird das Löschen durchgeführt, aber das scheint hacky zu sein.

Aktualisieren

Eine andere Version:

  • Reaktive Version
    • Hat immer die neuesten Daten. (a)
  • Render-Version
    • Hat die letzten Daten (b) plus eine Kette von Änderungen, die zu (a) führen.
    • Wenn das Rendering abgeschlossen ist, wendet es die Änderungen auf (b) an, so dass es letztendlich wie (a) aussieht.
Lance Pollard 06.02.2018, 05:44
quelle

1 Antwort

0

Von meiner Erfahrung als Unity Game Developer ist die richtige Entscheidung in der Mitte, da für die Physik in Game Engine genähert wird, weil das Gefühl eines halb perfekten Teils ziemlich perfekt ist.

Die Erklärung liegt darin, je realistischer und realistischer Ihr Ziel ist, je mehr Ressourcen Sie benötigen, nicht nur CPU und GPU, sondern auch Bargeld.

Nach dieser seltsamen Präambel, die ich für die Flagoptionen zitiere, ist die angewendete Methode nicht viel anders als ein normaler Garbade Collector, du markierst ein nützliches Objekt und wenn der Garbage Collector kommt, gibt er den von diesem Objekt verwendeten Ram Space frei, So kann dieser neue Raum wiederverwendet werden.

Der gleiche Prozess wird von einer großen Engine ausgeführt, und die Operation "destroy" kommt vor den Rendering-Berechnungen vor.

Das Endziel ist immer, eine gute Zwischenlösung zu erreichen.

Es besteht die Möglichkeit, die sofortige Zerstörung in jedem Moment des Motorberechnungsprozesses zu erzwingen, aber diese Lösung ist immer veraltet.

Bei der Animation verwenden Sie normalerweise die Option Destroy (Einstellung der zu zerstörenden Flagge) am Ende der Animation oder in den letzten Frames. Zumindest können Sie einige Tricks anwenden, um die Überblendung angenehmer zu machen (wie Partikel).

Das eigentliche Problem ist, wenn Sie Objekt über das Netz zerstören müssen (Multiplayer-Spiele), in diesem Fall müssen Sie feststellen, was der besuchbarere Rechner ist und wählen Sie, um Physik und Interaktion zu berechnen, dieser Rechner ist immer der Server oder Zumindest der Host (abhängig vom Spieltyp).

Ich weiß, dass die Frage als JavaScript-Frage markiert wurde, aber ich konnte nicht widerstehen, zu antworten.

Ich füge auch eine Seite aus der Einheitsdokumentation über die Destruct-Funktion bei und erkläre, wie sie dazu neigt, einen Gegenstand aus einer Spielumgebung zu entfernen:

Ссылка

Schönen Tag noch! und gute Codierung.

    
Davide Gozzi 14.02.2018 17:05
quelle