A DirectX Tiled Resources funkciójának elemzése

Miért kell a megatextúrázás?

A DirectX 11.2 előzeteséről nemrég írtunk egy hírt, viszont a Tiled Resources funkció amellett, hogy örömteli újítást vezet be, sok kérdést is felvet; hiszen opcionálisan támogatható, vagyis bizonyos értelemben nem része a DirectX szabvány követelményeinek. Azt kell mondanunk, hogy a vásárlók szempontjából ezek az opcionális funkciók a legkedvezőtlenebbek, hiszen nagyon mélyen bele kell ásniuk magukat, hogy melyik hardver mit támogat, amit a többség eleve nem fog megtenni, de még ha érdekli is a potenciális vevőt, akkor is komoly szaktudás kell ahhoz, hogy a Microsoft, illetve az adott gyártó leírását értelmezze.

Hirdetés

A korábbi cikkünkben az opcionálisan támogatható DirectX funkciókat annyira leegyszerűsítettük, amennyire csak lehet, így a linkelt oldalon a táblázat már jól értelmezhető a felhasználók számára. A Tiled Resources funkció ennél bonyolultabb, így ezt jóval nehezebb egy táblázattal elintézni, viszont nagyon fontos technikáról van szó, hiszen ennek használata meghatározó lesz a jövőben. A Tiled Resources beépítését is konkrétan a fejlesztők kérték, hiszen az új generációs konzolokban használt AMD GCN architektúra kínál egy Partially Resident Textures (PRT) eljárást a megatextúrázásra, amit nyilván mindenki szeretne kihasználni. Kell tehát egy átfogó implementáció a grafikus API-kba, de gondot jelent, hogy az elérhető hardverek szempontjából nem megoldható az egységes megoldás. Éppen ezért a Tiled Resources funkció két eltérő szinten lett implementálva egy szoftveres opció lehetősége mellett.

Mielőtt a különböző szinteket megnéznénk, fontos lenne tisztázni, hogy miért van szükség egyáltalán a Tiled Resources funkcióra, illetve magára a megatextúrázásra. Utóbbi a Rage című játékban szoftveresen volt implementálva, így túl jó benyomást nem tett a játékosokra. A megatextúrázás ötlete viszont zseniális és úttörő, így az új generációs grafikus motorokban szinte biztos, hogy helyet kap. A legfontosabb meglátni azt a tényt, hogy a játékok mérete extrém módon növekszik, és ezen belül is az adott program helyigényének 50-70%-át a textúrák teszik ki. Tulajdonképpen ez egy logikus fejlődési irány, hiszen a jó minőségű és éles textúrák alapvetően határozzák meg a játék grafikai megjelenését, továbbá a játékos is minőségi tartalmat szeretne látni a virtuális világ felületein. A textúrákat viszont be kell tölteni a memóriába, és ha a mai alkalmazások mellett figyelembe vesszük, hogy 5-10 GB-nyi adatról lehet szó, akkor könnyen kitalálható, hogy képtelenség ennyi információt a memóriában tárolni. Ez a probléma alapvetően nem új, lassan tíz éve elértük azt a szintet, hogy az összes textúrát egyszerűen nem lehet betölteni a VRAM-ba, így jöttek is a lehetséges megoldások a gondra.

Mára széleskörűen alkalmazott technika lett a textúrák streamelése, vagyis az adott játék motorja igyekszik úgy hasznosítani a memóriát, hogy csak az adott képkocka számításához szükséges textúrák legyenek benne, a többi pedig lényegében nem érdekes. Az ötlet kiváló, hiszen pont arra van szükség, hogy a felesleges adatokat ne kelljen tárolni a VRAM-ban. A streamelésre különböző algoritmusok születtek, melyek között természetesen voltak kevésbé jól működő alternatívák is, de manapság elmondható, hogy az elmúlt évek tapasztalatai alapján a fejlesztők igen jó implementációkat tesznek le az asztalra. Ugyanakkora a textúrák streamelése sem teljesen átfogó megoldás az alapproblémára, hiszen a PCI Express összeköttetés sebessége viszonylag lassú fejlődést mutat, amellett sűrűn keletkezik olyan igény is a programon belül, hogy egy adott textúrának csak egy apró részletére van szükség, de ehhez a teljes textúrát be kell tölteni, ami a memória pazarlásához vezet.

Nem elhanyagolható az az irányzat sem, hogy a mai játékok többségének motorja igen memóriaigényes deferred leképzőt használ, vagyis a textúrák számára biztosítható hely esetenként igen szűkös. Példának okáért a Battlefield 3-ban egy Full HD-s képkocka kiszámítása négymintás MSAA mellett valamivel több mint fél gigabájt memóriát igényel, és ezt csak a számításhoz szükséges render targetek és egyéb pufferek teszik ki. A manapság kedvelt többmonitoros rendszerek esetén, három kijelzővel már 1,5 GB helyigény is keletkezik, megegyező monitoronkénti felbontás mellett, míg 4K felbontáson a VGA-k többségéhez társított 2 GB VRAM-ba egyszerűen a négymintás MSAA-val megtámogatott képkocka számításához szükséges információk szimplán be sem férnek, és akkor még a textúrák nem is kerültek szóba. Persze ez a Frostbite 2/3 motor jellegzetessége, így felhozható ennek a gyökeres ellentéte is, a CodeMasters, forward leképzőt használó EGO motorja kapcsán, ami 1 GB VRAM-mal lényegében bármilyen igény mellett elvan. Sőt, az átlagos felbontások esetén még fél gigabájt memóriával is beéri textúrástól, mindenestül.

Extrém részletességű megatextúra a virágon Extrém részletességű megatextúra a virágon Extrém részletességű megatextúra a virágon
Extrém részletességű megatextúra a virágon [+]

Látható, hogy bizonyos leképzők használatával a textúrák streamelése sem kedvező, de évek óta vannak kutatások a következő lépcsőnek tekinthető megatextúrázás irányában. Ennek az elgondolásnak a koncepciója minden, textúrázással kapcsolatos problémát felszámolni. Ha belegondolunk az egész képszámítás lényegébe, akkor tulajdonképpen nincs is szüksége a motornak a textúrák minden egyes texeljére. Gyakorlatilag csak azok a texelek kellenek, amelyek segítségével történik a pixelek számítása. Ez Full HD felbontáson gyakorlatilag igen csekély, 100 MB-nál is kevesebb adatot jelent. A megatextúrázás tehát nem tesz mást, mint az adott megatextúrából – melynek mérete akár több terabájt is lehet – kiválasztja azokat az úgynevezett mozaikokat (textúraszeleteket), amelyek texeljeire szükség van az adott képkocka számításához, és ezt a – felbontástól függően – közel száz vagy párszáz megabájtos adatmennyiséget elhelyezi a VRAM-ban. A memóriaigény szempontjából ez a textúrázás leghatékonyabb formája, és a fejlesztők is lehetőséget kapnak a textúra részletességének igen extrém javítására, hiszen a megatextúrázás mellett tulajdonképpen nem számít a textúra tényleges mérete. Ez maximum a HDD-n vagy az SSD-n tárolandó adatmennyiség szempontjából lehet probléma, viszont egy nagy megatextúrával akár egy hajszálrepedés is reprezentálható egy kés nyelén, miközben ez a számítások és a memóriaigény szempontjából abszolút nem jelent extra terhelést. Persze ilyen bizonyosan nem lesz, hiszen egy hajszálrepedésre ki lenne kíváncsi egy játékban, de a példa jól szemlélteti a lehetőségeket.

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

Hirdetés

Fotóznál vagy videóznál? Mutatjuk, melyik okostelefon mire való igazán!

PR Vásárlás előtt érdemes megnézni, mit kínálnak az aktuális telefonok, ha igazán ütős képeket vagy profi mozgóképeket szeretnénk készíteni.

Azóta történt

Előzmények