Anno 1404: Quad-Core
In ersten Teil des Anno 1404-Entwicklertagebuchs auf PCGH stellen wir das proprietäre Multi-Threading-System vor, das Related Designs für seine neue 3D-Engine entwickelt hat und das erstmals in Anno 1404 zum Einsatz kommt.
Die Barriere
Quelle:
Burkhard Ratheiser - Related Designs, Leiter R&D-Abteilung
Frank Hoffmann - Related Designs, Software-Entwickler
Es kann durchaus passieren, dass bestimmte Aufgaben auf die Ergebnisse von vorher ausgeführten Jobs innerhalb einer Queue angewiesen sind. Um dies zu realisieren, kann eine Barriere in eine Job-Queue eingefügt werden. Sie veranlasst, dass alle Jobs, welche sich vor ihr innerhalb der Queue befinden, zuerst abgearbeitet werden. Somit liegen die Ergebnisse für die nach der Barriere folgenden Jobs auf jeden Fall vor und können von diesen weiterverarbeitet werden.
Bedeuten 4 Kerne gleich 4-fache Geschwindigkeit?
Nicht alle Programmteile lassen sich parallel ausführen. So können zurzeit bespielsweise alle Zugriffe auf die Grafikkarte mithilfe der Direct3D-Schnittstelle nicht parallel stattfinden. Dazu kommen voneinander abhängige Funktionen, die sich ebenfalls durch Barrieren nur sehr ineffizient darstellen lassen. Aus diesem Grund müssen alle sequenziellen (aufeinander folgenden) Programmteile, welche die Ergebnisse der Jobs weiterverarbeiten, spätestens zu diesem Zeitpunkt fertig abgearbeitet sein. Dies ist dann der wichtige Zeitpunkt der Synchronisierung. Dazu wartet der sequenzielle Teil des Programms auf das Beenden einer bestimmten Job-Queue. Damit diese Wartezeit möglichst klein bleibt, arbeiten die Worker-Threads diese Aufgabenliste bevorzugt ab.
Aufgrund der Tatsache, dass bestimmte Programmteile immer seriell ablaufen müssen, ist der Performance-Zuwachs bei realen Softwareapplikationen mit steigender Anzahl der Kerne limitiert. Er ist also sehr stark davon abhängig, inwieweit die jeweilige Applikation den Programmcode parallelisieren kann - möglichst so, dass auch alle Kerne optimal ausgelastet werden.
Multithreading am Beispiel unserer 3D-Engine
Die Engine versorgt die Worker-Threads parallel mit verschiedenen Aufgaben.
Es ist wichtig, bei dem Design der Softwareapplikation Elemente zu finden, die sich von Natur aus besonders gut zur parallelen Bearbeitung eignen, beziehungsweise deren Architektur entsprechend anzupassen. Da unsere 3D-Engine vom eigentlichen Spiel abgekapselt ist, läuft sie generell in einem separaten Thread. Um jedoch weitere Prozessorkerne optimal auszulasten, lassen wir innerhalb der 3D-Engine außerdem viele weitere Jobs parallel berechnen.
Aufgaben verteilen
Die parallele Berechnung geht schon beim Empfang der Daten los: Das Spiel schickt der Engine nacheinander, welche Objekte es wie und wo gerendert haben möchte. Zusätzlich hat unsere Engine noch eine eigene Liste von Objekten, deren Position in der Welt statisch ist, beispielsweise Berge, Bäume, Gräser und Gebäude. All diese Objekte werden in Job-Pakete zusammengefasst. Solche Objekte bestehen für die Engine aber tatsächlich aus mehreren Teilobjekten: Basismodell, Effekte, Billboards, kleine Fähnchen, Zierobjekte, Bodenplatten und vieles mehr - alle mit ihren ganz eigenen Parametern. Da die Anno 1404-Welt extrem detailliert ist, sind bei jedem Frame Tausende dieser Objekte auf dem Bildschirm auszumachen. Für all diese Teilobjekte werten die Worker-Threads nun die einzelnen Parameter aus: Sie prüfen, ob ein Objekt überhaupt gerendert werden soll, transformieren es richtig, wählen eine LOD-Stufe (Detailstufe) oder färben es ein. Nachdem nun die Job-Pakete abgearbeitet sind, liegen der Engine riesige Listen mit Objekten vor, welche zunächst sortiert werden müssen. Diese Sortierung sorgt für eine minimale Anzahl an aufwendigen State-Changes (Statusänderungen), die sonst die Grafikkarte ausbremsen. Dazu versorgen wir den Scheduler mit den Objektlisten, damit die Worker-Threads sie sortieren: nach Shader, Textur, ob einzeln oder per schnellem Instancing und so weiter.
Während diese Sortierung läuft, schickt die Engine weitere Aufgaben an den Scheduler: Die Cloth-Simulation für die Fahnen, Stoffe und Schiffsegel eignet sich gut für Multicore-CPUs, da jede Simulation unabhängig berechnet werden kann. Ebenso werden die Animationen und Partikeleffekte multithreaded kalkuliert und aktualisiert. Für andere Objekte berechnen die Worker-Threads bestimmte Parameter vor, die später an die Shader mitgegeben werden. Selbst die miteinander verschmelzenden Selektionskreise der Schiffe werden parallel zu den anderen Aufgaben durchgeführt. Zu guter Letzt wartet die Engine auf die Fertigstellung aller Jobs und sendet die Daten zur Darstellung an die Grafikkarte.


Auf Diablo 3 darf man sicher noch ein ganzes Weilchen warten (2010?) und für meinen teil zieh ich Anno vielem nun mal vor. Bin aber anderen Spielen auch nicht abgeneigt.
ajo, ist eigentlich für AoE mal was neues angekündigt oder lässt sich MS damit mal so richtig Zeit? Wär mir nämlich neu.
(Auch bei Freelancer wartet man ja schon sehr lange mal auf einen Nachfolger... hoff mal das es bei AoE nicht soo lang dauert.)
Und je nach dem wann Anno erscheint gibts bis dahin evtl. noch nen Quadcore
Bin auf jeden Fall schon mal richtig gespannt auf das neue Anno. Nicht zuletzt weil es da eben mal wirklich eine Engine gibt die Multicore richtig gut unterstützt. Was es ja bisher kaum oder gar nicht gab.
ich für meinen teil warte zur zeit auf diablo 3 und sollte ein neues age of empires kommen würde ich das mit sicherheit jedem anno teil vorziehen ...
naja meine meinung find das gameplay bei der anno reihe einfach net ganz so prickelnd ...
Und je nach dem wann Anno erscheint gibts bis dahin evtl. noch nen Quadcore
Bin auf jeden Fall schon mal richtig gespannt auf das neue Anno. Nicht zuletzt weil es da eben mal wirklich eine Engine gibt die Multicore richtig gut unterstützt. Was es ja bisher kaum oder gar nicht gab.
das ist die Zukunft aller PC Programme würde ich meinen.