Dan Baker von Oxide Games hat auf der Khronos-Veranstaltung anlässlich der Siggraph 2018 noch einmal über den
Wechsel von alten auf neue APIs für Gameengines rekapituliert (
video).
Die Schwierigkeit liegt dabei aus seiner Sicht nicht in der API selbst, sondern darin die alten Konzepte zu verwerfen und asynchrones Multithreading zu denken und umzusetzen. Er gibt viele grundlegende Ratschläge bzw. Dos&Don'ts wie man Multi-CPU Konzepte erfolgreich umsetzt.
Er erläutert dabei wie alte Engines funktionieren und warum diese nicht erfolgreich umgebaut werden können. Man selbst verfolgt dabei recht pragmatische Ansätze.
Deshalb sind alle Komponenten der Engine in eigene Module entkoppelt und es gibt lediglich einen zentrales System für Scheduler und Messaging, alle anderen Services arbeiten dabei so weit wie möglich asynchron parallel. Das Scheduler und Messagingsystem verteilt die Jobs bzw. Tasks auf die zur Verfügung stehenden Threads auf CPUs und GPUs. Synchronisation - gerade unnötige implizite Synchronisation durch die Compiler - wurde weitestgehend abgeschafft.
Sämltliche Shader-Daten werden je Frame komplett neu übertragen, man macht locker 50.000 bis 100.000 Drawcalls, dafür keine Vertex oder Constant Buffers. Dabei werden den etablierten Threads je Frame zwischen 100 bis 500 Jobs verteilt um von der Engine and die Vulkan API übersetzt zu werden. Konstanten werden garnicht zwischen den Frames verwaltet, man hofft auf die treiberseitigen Optimierungen und war bislang von der Performance sehr überzeugt.
Die eigene Engine kann so neben den sonstigen Modulen der Engine für Vulkan bereits sämtliche CPU-Threads nutzen. Die Crux dabei ist, dass für Vulkan selbst im eigenen Fall kaum mehr als 1 oder 2 Kerne für diese "GPU Command" benötigt werden, man ist schon mit einem Kern in bis zu 4ms fertig. Die Cores stehen dann also im Wesentlichen für die anderen Services zur Verfügung.
Interessant ist auch das Statement zu Apple Metal, dass man dort voraussichtlich nicht wirklich mehr als 4 Cores gut nutzen kann.
Mein Kommentar
Letztlich nutzt aber auch die Umsetzung in der Nitrous Engine noch nicht alle Vulkan-Features, die eine Treiberoptimierung je Anwendung gänzlich obsolet machen würde, da eben bestimmte Features noch nicht genutzt werden, die dann von den jeweiligen GPU-Herstellern in für die Harware generisch optimierten Funktionen abgearbeitet werden können.
Die Parallelen zum Vortrag von Adam Sawicky sind offensichtlich
Sehr schön ist auch im Kontrast der
Vortrag im Anschluss von
Mikko Strandborg zur Unity-Engine, bei der Vulkan auf die bestehende Konzepte angewendet werden soll, entsprechend berichtet er über wenige Erfolge und viele Probleme im asynchronen Ansatz mit Vulkan.
Man fragt sich letzlich ob für Unity (oder Unreal-Engine) bald eine Zäsur gewagt wird um mit einem Neuanfang den Ballast alter Konzepte abzwerfen und neue Möglichkeiten der Low Level APIs zu nutzen.