Nochmal eine kurze Übersicht:
Es gibt einen EventManager, der zu festen GFs zuvor eingerichtete Events an Objekte (z.B. Träger) weitergibt. Wenn nun ein Träger loslaufen soll, so wird zunächst (auf allen Clients) der Weg berechnet und dann das erste Wegstück betreten. Hierfür wird ein Event erzeugt, dass die Callback-Funktion (obj->HandleEvent()) aufruft. In diesem Fall würde dann der Weg fortgesetzt, bis der Träger an einer Flagge ist oder es z.B. keinen Weg, kein Ziel, ... mehr gibt. An einer Flagge gäbe es dann wieder Pathfinding. In der Logik springt der Träger also zu fest definierten GFs von Punkt A zu Punkt B ohne Zwischenschritte.
Der Renderer macht sich zu nutzen, dass er die Länge dieses Sprungs kennt und interpoliert die Position, an der die Figur letztendlich dann gezeichnet wird.
Für all das ist keinerlei Interaktion über das Netzwerk notwendig. Es läuft lediglich auf jedem Rechner exakt dasselbe ab.
Waren z.B. werden alle x GF irgendwo produziert, solange die Voraussetzungen gegeben sind. Wenn eine Ware produziert ist, veranlasst dies Pathfinding für den Weg und die entsprechenden Träger werden immer dann benachrichtigt, wenn an einer sie umgebenden Flagge eine Ware aufläuft, die über ihren Weg transportiert werden muss.
Alles, was da an Zufall drin steckt, wird über einen (Pseudo-)Zufallszahlengenerator generiert, der dadurch, dass er an denselben Stellen aufgerufen wird, dieselben Werte liefert. Der Async-Check basiert neben einem Vergleich der Anzahl der Objekte und der höchsten Objekt-ID auch auf einem Vergleich des internen Wertes dieses Zufallsgenerators, mit dessen Hilfe die Zufallszahlen berechnet werden.
Wie PoC schon schreibt: lediglich das, was nicht berechenbar ist, also vom Spieler veranlasste Aktionen (Gebäude/Wege/Flaggen bauen/abreißen, Optionen umstellen, ...) wird übertragen.
Zu Asyncs kommt es nun also immer dann, wenn entweder eine solche Übertragung notwendig wäre, aber vergessen wurde, Überläufe (32-bit vs. 64-bit) auftreten, auf nicht initialisierten Speicher zugegriffen wird oder ähnliche Dinge. Das Problem mit dem Finden von Asyncs ist, dass man immer nur die Konsequenzen (Random-Wert, Objekt-ID/-Anzahl) beobachten kann, jedoch nie die Ursache.