DE/Unkown Horizons Architektur
From Unknown Horizons
Erklärung der verschiedenen Bereichen:
Timer Der Timer bekommt von Fife regelmäßig die Kontrolle übergeben (es wird vor/nach jedem frame einmal ne Funktion aufgerufen), der Timer hat 2 listen, test und call - die Testliste wird zunächst durchgegangen und jede eingetragene Funktion wird aufgerufen, diese können eine der konstanten Timer.TEST_* rück geben, und damit entweder den tick zulassen oder ihn nicht zulassen, sobald ein test den tick nicht zulässt, wird die Kontrolle zurück an Fife
- TEST_PASS: Tick darf stattfinden (bedeutet auch das am ende die tick id erhöht wird)
- TEST_SKIP: Tick wird nicht weiter ausgeführt, erst wenn der nächste tick stattfinden würde wird erneut getestet
- TEST_RETRY_KEEP_NEXT_TICK_TIME: Tick wird nicht weiter ausgefhrt, sobald der Timer wieder von FIFE die kontrolle bekommt wird erneut geprüft, hier wird der startpunkt des ticks nicht zurückgesetzt, wenn also bis der nächste tick stattfinden darf viel zeit vergeht, werden eventuell mehrere ticks hintereinander ausgeführt
- TEST_RETRY_RESET_NEXT_TICK_TIME: Wie zuvor, jedoch wird hier der startpunkt des ticks zurückgesetzt, bedeutet der nächste tick hat die normale dauer
Scheduler
Der Scheduler hat eine Funktion die aufgerufen wenn ein tick stattfinden soll (Eintrag in der call liste des Timers), außerdem hat ein ein Interface für Objekte(World Objekte, alsoUnits, Buildings,...) die regelmäßige oder einzelne aufgaben auszuführen haben, diese können darüber Funktionen eintragen und Funktionen löschen jeweils mit Parametern wie ab welchem tick die Funktion auszuführen ist, wie viel Ticks zwischen aufrufen liegen so.
Fife
Fife ist kein Objekt im eigentlichen sinne es stellt einfach die gesamte Fife Engine dar, diese ist eng mit der GUI verknüpft, übergibt regelmäßig die Kontrolle an den Timer, bekommt die meisten Darstellungsdaten von den World Objekten (bedeutet die World Objekte sagen der Engine welches Objekt wo und wie darzustellen ist. Außerdem kann der Manager der Engine befehle geben (wie die Engine zu pausieren oder ähnliche dinge)
GUI
Die GUI stellt die Ingame GUI dar, sie kommuniziert viel mit der Fife Engine, gibt befehle an den Manager und fragt die World Objekte nach Informationen, wichtig ist das keine Aktionen direkt auf die World Objekte ausgeführt werden dürfen.
Manager
Im Single Player Modus macht dieses Objekt nicht viel, es bekommt befehle von der GUI, sendet diese direkt an die World Objekte und die Fife Engine weiter (führt sie aus), sonst macht sie nichts
Manager(Multiplayer):
Im Multiplayer Modus hat der Manager die Aufgabe der Synchronisation zwischen den einzelnen Mitspielern, er bekommt befehle von der GUI, speichert diese und sobald ein tick stattfindet, schickt er alle befehle die bis zu diesem tick von der GUI kamen an die Mitspieler, außerdem führt er die zuvor gesammelten befehle von sich und allen Mitspielern (über das Netzwerk eingetroffen bzw. von der GUI kommend) aus (diese gehen dann an die World Objekte bzw. an die Fife Engine, je nach befehl). Außerdem ist es die Aufgabe des Multiplayer Managers einen tick aufzuhalten wenn nicht alle Mitspieler ihre befehle geschickt haben (einfach eine test Funktion im Timer registriert)
World
Hierbei handelt es sich um eine Sammlung von Objekten, die auf allen mitspielenden OpenAnno Instanzen (also auf allen computern der Mitspieler) synchronisiert sind, bedeutet zu dem tick X sind alle dortigen Objekte identisch. das ist sichergestellt da der (Multiplayer)Manager befehle immer in der selben Reihenfolge und immer zum selben tick ausführt. Einige Objekte können sich beim Timer registrieren und so entweder einen tick aufhalten (beispielsweise ein pause zustand, welcher durchaus im World bereich liegen kann) oder ein sehr oft aufgerufenes Objekt (z.b. ein Computer Mitspieler, welcher am ende jedes ticks seine nächsten Aktionen planen soll) registriert sich beim Timer als normale call Funktion. alternativ kann ein Objekt den Scheduler nutzen um regelmäßiges oder einmalige Ereignisse in der Zukunft auszuführen (ein Baum wächst z.b. und soll vielleicht alle 100 ticks ein holz dazubekommen oder so) des weiteren gestalten die World Objekte (Buildings, Units, ...) die Objekte die in Fife dargestellt werden. Außerdem gibt es noch eine Verbindung zwischen der GUI und den World Objekten, hier als Pfeil von World zu GUI dargestellt, wichtig ist das zwar die GUI anfragen stellt (Funktionen wie getXYState aufruft) aber niemals Aktionen von der GUI direkt ausgeführt werden dürfen.


