Zuallererst, 500ms ist auch nicht in Stein gemeiselt, sondern auch dummy code, welches den Aspekt "Simulation macht hoch komplexe Aufgaben und braucht viel rechenleistung - Visualisierung ist flüssig und ruckelt nicht" übertrieben demonstriert.
Man kann auch die Schritte nach 100ms oder 50ms reduzieren, je nach dem wie wir unsere Zeiteinheit definieren wollen. Bei dwarf fortress gibts eine Simulationsrate von gefühlte 6-10 steps die Sekunde, wenn man sich die videos anguckt. Das sind 100ms-166ms.
Idealerweise sollen alle Aufgaben, die die Simulation erledigen soll, innerhalb dieser Zeitspanne geschehen, und 100ms ist allein schon sehr viel Zeit. Um eine gewisse synchronität zwischen Vis und Sim zu gewährleisten, habe ich erstmals vorgeschlagen, dass Simulationsschritte konstant lange dauern, und die überbliebene Zeit geschlafen wird.
2. Eine Art Manager, bei der sich die Entitys registrieren, wenn sie denken, sie benötigen in nächster Zeit ein Update. Wenn sie keins mehr brauchen, werden sie aus dem Manager gekickt.
Das ist geplant und hatte ich vor demnächst so einzubauen.
Ich würde hier vorschlagen, noch eine weitere Abstraktionsschicht einzuführen. Eine Schicht, die Befehle, die über Zeiträume hinweg ausführen soll, umsetzen kann, ohne die Simulation im Hintergrund zu stören.
Wir bleiben mal beim Movement:
Die Simulation sagt "Bewege die Figur da hin". Damit ist die Simulation raus, weil sie die bestmögliche Reaktion gefunden hat.
-> Jetzt springt die "Zwischenschicht" ein. Diese Schicht sorgt nun dafür, dass die Figur anhand der gegebenen Umstände (Hindernisse, Bewegungsgeschwindigkeit, etc.) an ihrem Ziel ankommt und informiert die Simulation über Erfolg oder etwaige Probleme. Dadurch wird sie am Ende wieder für einen Simulationsschritt "registriert".
-> Ganz oben kommt dann eben die Visualisierung, die zwischen den verschiedenen Tiles die Schritte interpoliert.
Da muss ich fragen, ist diese Zwischenschicht dann auch eine art Simulation, die auch in einem Thread existiert, und auch regelmäßig tickt? Wo ist dann der Unterschied zur aktuellen Simulationsinfrastruktur? Denn genau für sowas kann doch die Simulation jeden Schritt erledigen. Ich bleibe bei deinem Bespiel und erkläre wie man es machen könnte:
1) Das Spiel schickt der Simulation das Kommando, dass eine Entity sich nach Position XY bewegen soll (asynchron, sprich der Befehl wird erst beim nächsten Simulationstick bearbeitet).
2) Die Simulation wertet den Befehl aus, versetzt die Einheit in dem "Moving" Zustand
3) Bei jedem Simulationsschritt passiert in der Update der SimEntity folgendes:
- die Einheit wird je nach berechneter Bewegungsrichtung und -geschwindigkeit versetzt
- ist das Ziel erreicht, dann geht die Einheit in dem "Idle" Zustand, oder
- die direkte Umgebung (Hindernisse, usw.) werden evaluiert und daraus werden die nächste Bewegungsrichtung und -geschwindigkeit ermittelt (Pathfinding)
Wie dann auch eben implementiert, kann Vis anhand von der Bewegungsrichtung und -geschwindigkeit und der Simulationsrate die Tatsächliche Position präzise ermitteln.
Da sich die Welt ständig zwischen Simulatonsschritten ändert, müssen sich Einheiten dazu anpassen, sprich: Ihre Bewegung kann nicht 1x im Voraus berechnet werden, sondern kann sich je nach Umständen immer ändern. Bestes Beispiel: Ein Feind sieht die Entität und läuft auf ihr zu, spätestens bei direkter Nachbarschaft ist Schluss mit Bewegen.
Es wird dann noch viel viel mehr Logik zur Einheiten-Simulation kommen, weswegen ich die "Bewegung" nur als eine von vielen sehe. Sie auszulagern würde, gegeben mein Beispiel mit dem Feind oder die sich ständig verändernde Umgebung, die Sachen verkomplizieren.