Miért probléma a shader fordítás PC-n?

A hagyományos és az explicit grafikus API-kkal sem volt jó a helyzet, holott konzolokon vajsima a kapott élmény.

Shader fordítás most

A régebbi fordítási modell tehát semmiképpen sem működött, így új megoldás felé nézett az ipar. A DirectX 12-ben a Microsoft ki is dolgozott egy alternatív megoldást, amit aztán a Vulkan API is bevetett. Utóbbit nem elemezzük külön, a lényeg annyi, hogy a koncepció rendkívül hasonló, tehát ebből a szempontból a Microsoft és a Khronos Group is ugyanúgy látta a jövőt. A különbség az eltérő köztes nyelvből eredt, mivel előbbi a DXIL-t, míg utóbbi a SPIR-V-t hozta, de a lényegük ugyanaz.

A DirectX 12 legnagyobb újítása, hogy leszámolt a töménytelen mennyiségű objektummal, helyettük csak egy van: a Pipeline State Object (PSO). Ehhez kell nyúlni minden shadernél, minden futószalaglépcsőn, és ez kerül lefordításra egy bináris nagyobjektummá. Az erőforrásokat is egyszerűen a leírótáblákba kell bekötni, ami a processzor oldalán is nagyszerű, hiszen nagyon csekély mennyiségű API hívás lesz, ez pedig kíméli a processzoridőt.

Ez a fajta rendszer az optimalizálást is erőteljesen átalakítja, ugyanis az már nem a magas szintű shader kód köztes nyelvre való lefordításakor történik meg, hanem a PSO generálásakor. Ez azért hasznos, mert a hagyományos API-k esetében nagyon sok információt nem tudott maga a program, így csak egy magas szintű kódot kapott a Microsoft fxc fordítója, amiből készített egy alacsonyabb szintűt. De itt még közel sem volt optimális a helyzet, mivel a megfelelő optimalizáláshoz tudni kellett az objektumok használatakor a lehető legtöbb hardverállapotot, amit DirectX 11-ben egyszerűen nem lehetett előre látni pusztán a magas szintű kód alapján. A PSO generálásakor viszont már megvannak ezek az információk, vagyis a rendszer képes hatékonyabban optimalizálni, és ezt kihasználják például a meghajtók shader fordítói is, ugyanis számos olyan extra adatuk van, amivel a hagyományos API-knál nem rendelkeztek. Ilyen formában nagyrészt hasztalanná válik az egyes shaderek utólagos cseréje, hiszen az explicit API-k működésével általánosan is lereagálhatók a körülmények, fel lehet ismerni az egyes helyzeteket, amelyekre a meghajtó az előre beprogramozott választ tudja adni, jobb kódot biztosítva az adott PSO-khoz.

A shader fordítás vázlata DirectX 12 API-val
A shader fordítás vázlata DirectX 12 API-val [+]

Mindez szép és jó, de van vele egy aprócska probléma. Amíg a korábbi, DirectX 11 által alkalmazott modellben az optimalizálás előre megtörtént, addig erre itt a futtatási időben van szükség. Persze itt nagyon jó hír, hogy maga a shader fordítás extrém gyors lett. A korábbi fxc fordító szépen kihasználta az idejét a fejlesztők gépén, egy-egy shader fordításánál nyugodtan el lehetett menni kávézni, akár a város másik végén fekvő boltba is be lehetett ugrani egy csirkéért, és visszatérve még egy pörkölt megfőzése is belefért. Ez azért volt ennyire hosszadalmas, mert maga az optimalizálás a fordítás során történt meg a fejlesztők PC-jén. Az új DirectX Shader Compiler már több nagyságrenddel gyorsabb, még a kávéval is igyekezni kell, nemhogy főzésen járjon az eszünk. Ennek oka, hogy az optimalizálás a programmal szállított köztes kód kapcsán csak részben történik meg, a további finomhangolás majd futtatási időben, a shaderek végleges fordításánál lesz végrehajtva, amikor az adott grafikus vezérlő számára emészthető kód készül.

Itt viszont már nem fér bele órákig történő elmélkedés a fordító oldalán, jó esetben ezredmásodperceken belül kell az eredmény, ami persze komplexebb shaderek mellett nem lesz meg. Emiatt az egyes explicit API-t használó játékok az indításnál előre lefordítják a shadereket, ami gyengébb processzorral negyed órát vehet igénybe. Ez túlélhető, de mivel az egyes PSO-k generálása során a meghajtó is számos optimalizálással él, a keletkező kódok specifikusan az adott eszközillesztőhöz szabottak. Vagyis, ha az alkalmazás frissül vagy a felhasználó új meghajtóprogramot telepít, akkor újra le kell fordítani a shadereket.

Persze a shader fordítás történhet a tényleges játék során, vagyis amikor épp szükség van az egyes kódokra, akkor történik meg azok generálása és optimalizálása, ezáltal viszont van esélye annak, hogy akadozó játékélmény lesz a végkifejlet, amíg a fordítás be nem fejeződik. Ráadásul erre is igaz az, hogy ha frissül az alkalmazás vagy új meghajtó települ, akkor kezdődik az egész elölről.

A cikk még nem ért véget, kérlek, lapozz!

Azóta történt

Előzmények

Hirdetés