Hirdetés

Körvonalazódnak az id Tech 6-ra épülő VoidEngine képességei

Az Arkane Studios talán sokak számára ismeretlen név, de olyan címeket tettek már le az asztalra, mint az Arx Fatalis, a Dark Messiah of Might and Magic és a Dishonored. A vállalat viszonylag lassan dolgozik, de a munkjuk gyümölcse mindig jó lesz, és most éppen a Dishonored 2-n ügyködnek.

Az Arkane Studios egyik legnagyobb problémáját az elmúlt években a felhasznált videojáték-motor jelentette. A cég a Dark Messiah of Might and Magic és a Dishonored című alkotásokhoz licencelt rendszert vetett be, amelyek működtek ugyan, de behatárolták a stúdió lehetőségeit. Emiatt a vállalat úgy döntött, hogy a Dishonored 2 elkészítésében nagyobb szabadságot adnak maguknak, így kvázi házon belüli fejlesztésre álltak át. Ehhez az alapot az ID Software adta, hiszen a Zenimax az érintett céget 2009-ben felvásárolta, és technológiákat, illetve a programozókat beolvasztották a Bethesdába.

Hirdetés

Az Arkane Studios tulajdonképpen az id Tech 6-ot választotta a következő projektjéhez, pontosabban ennek az alapját, ami 2012-ben elérhető volt. A motor további fejlesztését már házon belül végezték, és emiatt kapta a VoidEngine nevet. Ez a stúdió eddig legnagyobb projektje, hiszen komoly célokat tűztek ki maguk elé annak érdekében, hogy a Dishonored 2 a lehető legjobb legyen.

Jérémy Virga, a stúdió motorprogramozója tartott nemrég a célokról egy előadást, amelyben a főszerep a skálázódás biztosításáé volt. A Dishonoredhez használt módosított Unreal Engine 3 legnagyobb problémája az volt, hogy nagyon gyengén skálázódott a többmagos processzorokra, mivel egy fő szálon futott a játék logikája, és mellette futott egy leképező szál, amely generálta a GPU-nak a parancsokat. Ezzel a fő gond, hogy igazán jól csak a kétmagos processzorokat képes leterhelni, de ma már ez nagyon kevés. A VoidEngine emiatt egy úgynevezett munkarendszerű motor, amelynek van egy fő szála sok másik munkaszállal. A fő szál végzi lényegében a munkaszálak vezérlését, a skálázódás pedig igen komoly lehet, mivel a 6-8 magos processzorokat is ki lehet használni, de a fő cél a kifejezetten gyorsan terjedő négymagos lapkák hatékony befogása volt.

Többszálú feldolgozás a múltban és a jövőben Többszálú feldolgozás a múltban és a jövőben
Többszálú feldolgozás a múltban és a jövőben [+]

A munkarendszerű ütemezés persze nem egyszerű, mivel a hatékony működéshez a játék logikáját, illetve a leképezést is párhuzamosítani kell a többszálú feldolgozás érdekében. Csak az egyik nem elég, mert az általánosan csökkenti a teljesítményt. A legnehezebb ezt a leképező szempontjából elérni, ugyanis arra van szükség, hogy a több GPU kontextus bármelyik szálról generálhasson parancsot ráadásul teljesen párhuzamosan. Ezt a metódust az aktuális elterjedt PC-s API-k nem támogatták, de jönnek az új generációs rendszerek, amelyek már sokkal nagyobb szabadságot engednek meg.

Persze a rendszer struktúrájának felépítése nem ilyen egyszerű, ugyanis a leképező működésénél számos optimalizálás bevethető. A legnagyobb teljesítménygyilkos a CPU-oldali feladatfüggőség a feldolgozás ütemezésére, illetve az adatszinkronizációra vonatkozóan, így ezeket a helyzeteket lehetőség szerint el kell kerülni. A GPU-oldali függőségek a CPU-oldali párhuzamosítást nem befolyásolják, viszont a parancsleadás megfelelő sorrendjét biztosítani kell, így erre vonatkozóan is érdemes optimalizálással élni. Az átláthatóság érdekében a VoidEngine explicit feladatokra van felosztva, amelyek kötegelve tartalmazzák a bemenetek és kimenetek meghatározását. Sűrűn előfordul, hogy az egyik feladat függ a másiktól, mivel a bemeneti adat szempontjából az előző kimeneti adatát igényli. Ezeket a kódmenedzselés szempontjából érdemes összeláncolni. Akár az is előfordulhat, hogy bizonyos feladatokra nincs is szükség, így ezek kihagyhatók. Emiatt az ütemező a VoidEngine-ben úgy van felépítve, hogy kihagyott feladat esetében a feladatláncokat megfelelően módosítsa. Végül az új motor fontos eleme még, hogy az egyes feladatok alacsony prioritással futtathatók. Ezek jó ha végeznek időre, de az sem baj, ha csak a következő képkockára lesz eredményük. Ilyen esetben a motor nem fog ezekre a feladatokra várni a képszámítás megkezdésével. Ennek a módszernek az ellentéte a kényszerített lefuttatás, amely elsődlegesen a felhasznált middleware és API limitációk megkerülésére lehet alkalmas.

A VoidEngine eredményei
A VoidEngine eredményei

A VoidEngine esetében a fejlesztők az előbbi optimalizálásokkal 40-60%-kal csökkentették a leképező munkák összesített időigényét egy hétmagos processzoron. PC-n nyilván ennek 6 vagy 8 maggal rendelkező processzoron lesz lényeges előnye. A koncepció nagyon jól működik a konzolon, illetve az új PC-s API-kon, mint az AMD Mantle, a Microsoft DirectX 12 és a Khronos Group Vulkan.

A VoidEngine limitációi
A VoidEngine limitációi

Rendkívül hátrányos azonban a működés a DirectX 11-es API-n, amelyet nem ehhez a feldolgozási struktúrához terveztek. A legnagyobb probléma, hogy az átlagos teljesítmény ugyan nem rossz, de esetenként számolni kell rendkívüli teljesítményvesztéssel. Optimalizálási lehetőség lehet a deferred context használata, de ez nagymértékben kiszámíthatatlanná teszi a feldolgozást, így az átlagos teljesítményen javít, a minimum értékeken viszont ront. Ezek miatt bekerült a motorba egy hibrid mód, amely a GPU-ra vonatkozó feladatokat csak egy szálon futtatja, vagyis ez egy mono kontextusban futó rendszer. Ennek a hátránya, hogy lassú, de előnye, hogy nem lesznek extrém teljesítményingások a futtatásban. Valójában a DirectX 11-es mód sehogyan sem lesz jó, így a megfelelő élményhez a PC-n is modernebb API-n kell futtatni a Dishonored 2-t.

VoidEngine aszinkron compute és DMA
VoidEngine aszinkron compute és DMA

Végül a VoidEngine még aktív fejlesztés alatt álló része a GPU-k jobb kihasználása az aszinkron compute és DMA funkciók által. Ez a mód a konzolokon, illetve a modern API-kon lesz elérhető. A pontos részletek sajnos még nem ismertek.

Azóta történt

Előzmények

Hirdetés