22. 2. 2014

Resolution gate - definitive edition


Hneď na začiatku si v tom urobme opäť raz jasno. Dve axiómy.  Každá natívna XO hra môže bežať bez väčších ťažkostí v 1080p/30-60fps móde, musíte však akceptovať primerané zhoršenie kvality grafiky /fyziky, AI/, často pod úroveň bežného štandardu. A akákoľvek dobre optimalizovaná PS4 only  hra bežiaca v 1080p/30-60 apriori nemôže bežať v tomto rozlíšení, pri zachovaní tej istej úrovne grafiky /AI, fyzika/ na XO. Bez ohľadu na vašu snahu a mlátenie jazykom sa tým nedá nič urobiť. Je mi fuk čo teraz poviete - nie je s tým možné pohnúť.

Dôvody sú prísne logické, matematicky a fyzikálne nepriestrelné. Už aspoň desať krát som tu písal o neprekonateľne zásadných rozdieloch vo výkone GPU PS4 a Xbone - sú proste veľké /a rýchlejšie PS4 API, štíhlejšie OS ich len umocňuje/. A aj keby obe konzoly použivali identické CPU a GPU, XO dokonale vybuchne na použitom pamäťovom systéme. RAM XO je sama o sebe dostatočný dôvod na to, prečo XO hry /bežné multiplat gamesy vyskytujúce sa na oboch platformách/ nikdy nebudú bežať vo vyššom rozlíšení ako na PS4ke. Sledujete aký šikovný manéver som použil. Použijem teraz jednu pomocnú, didaktickú pomôcku, nejde o retro off-topic úlet.

Číslo 6912 by malo byť dobre známe každému spektristovi, nenakazenému vírusom bezbrehého ignorantsva. Ide o veľkosť vram 8 bitového ZX spectra. Rozlíšenie obrazu 256x192 pixelov = 49 152 bitov/8 = 6144 bajtov plus 32x24 /atribút 8x8 pixelov/ = iba 768 bajtov pre "farbu". Akákoľvek zmena rozlíšenia, farebnej hĺbky /speccy má iba 2 farby na 8x8 štvorec/, nedajboh double buffering /128K speccy to umožňuje/ toto číslo veľmi rýchlo nafúkne na 2-3-4 násobok. Ram však bola veľmi drahá, a rýchle zbernice, ktoré by ju vedeli nakrmiť ešte viac /DMA !!/.  Zvolilo sa teda toto geniálne riešenie s farebnou hĺbkou, konkurencia išla opačnou cestou do signifikantne nižšieho rozlíšenia 160x200 s viac farbami na "atribút".

Dnes to funguje stále presne týmto spôsobom, čo rovnako, horšie !! Prakticky všetky moderné grafické enginy/middleware fungujú v DR - deferred render režime /oddelenie geometrie od svetla, možnosť mať na ploche tisíce svetelných zdrojov na rozdiel od klasického, starého FR - forward rendering/. Jednou z nevýhod DR je pekelná nenažranosť na ram a priepustnosť. Snáď vás nepomylím, keď najprv uvediem nároky normálnej "FR" hry v 1080p/2xMSAA - to robí pri RGBA16f t + D32 depth buffer - cirka 48 megabajtov vram, ktorú niekde musíte uložiť. PS4ke je to jedno, čo však urobí XO ?

Jeho eSRAM má iba 32 mega, hoďme teda ten zbytok do systémovej DDR3. Problém. Grafické dáta zrazu máme v ramke, ktorej reálna rýchlosti je minimálne 2-3 menšie ako pri PS4 /plus strácame HSA koherenciu/. Aj laikovi dôjde, že to smrdí buď zásadným poklesom framerejtu alebo grafických detailov, či všetkého naraz. Nuž tak znížme rozlíšenie na 720p-900p a napchajme to všetko do tej malej eSRAM. A to sa aj skutočne deje. Avšak skutočný život je ešte zákernejší.

Ako som už povedal - minimálne 95% všetkých veľkých hier beží v DR režime a tám sú nároky zhruba takého. Použijem reálny príklad chystanej PS4 hry, ktoré mám od skutočného progiša, nazvime ho Matt. Deferred rendering si pomocné dáta drží v rozličných bufferoch /niečo ako tých 768 bajtov pri spektre na farbu/. Tieto buffery /dokopy vytvárajú jeden veľký tzv. G buffer/ sú pri našej hre rozhodené asi takto:  Lighting target: RGBA16f  + Normals: RG16 +  Diffuse albedo/BRDF ID: RGBA8  + Specular albedo/roughness: RGBA8 +  Tangents: RG16 + Depth: D32. Pomocou nich si jednoducho povedané vie engine poradiť s odrazivou alebo pohltenou zložkou svetla, hĺbkou obrazu a desiatkami ďalších operácii. Vynásobme teda bity a bajty a dostaneme.

V natívnom rozlíšení 1080p =  (8 + 4 + 4 + 4 + 4 + 4) * 1920 * 1080 = cca 55 mega. Áno je to viac ako pri FR hre ale sranda sa ešte neskončila. Náša hra má až 16 svetiel na scéne, ktoré vrhajú tiene v reálnom čase /ďalšie tisíce - "statické"/, tie svetlá potrebujú iný buffer pre tieňové shadowmapy /16 x 1024 x 1024 pixelov/ a ďalších 4 x 2048 x 2048 pre direkt svetlá, globálne ako je napríklad "slnko". To nám dáva 64+64 /kaskádové tieňové mapy ďalších "mip" úrovní/ =  128 mega ďalších grafických dát, áno - eSRAM XO sa nám už dávno minula. V tomto momente sa nám tu teda váľa naliehavá potreba pre asi 180 megovú rýchlu vram. A to sme sa ešte nedostali ani ku 1/3 skutočných požiadaviek, kdeže sú naše textúry však !!

Už vieme ako si s tým poradí XO, však ? Do esram natlačí na rýchlosť najviac kritické časti G buffera /ten zjednoduší na kosť, aj za cenu straty kvality grafiky a efektov/ a samotný základný framebuffer. Pochopiteľne v čo najmenšom rozlíšeni, presnosti, hĺbke. Zvyšok ide do pomalej DDR3, kde sa nad nimi podpíše doslova rozsudok smrti. Trochu preháňam, ale presúvať dáta hore a dole z DDR3 do eSRAM, minimalizovať, optimalizovať, orezávať, zjednodušovať a trhať si vlasy je presne to čo dnes vývojári robia pri programovaní XO. Civilné auto však aj tak nikdy formulu F1 nepredbehne.

Programátor Matt v skutočnosti maká na PS4ke /okrem iného je aj DirectX, XNA - Most Valuable Professional MVP/, je jedným z kóderov Ready at Dawn Studios /The Order: 1886/. Aj on vie, že tá eSRAM v XO mohlo mať 128 megabajtov namiesto dnešných 32 /teda 6 krát viac/, ak by MS použilo eDRAM /1T na bunku/ namiesto eSRAM /6T na bunku/, tá vlastne takto zaberá 6 krát viac drahocenného miesta na AMD APU, alebo pri rovnakej ploche má 6 krát menšiu kapacitu. A dovôd prečo to MS urobilo je prostý - ekonomika výroby eSRAM /je dostupnejšia, lacnejšia, výrobne jednoduchšia, hlavne pri prechode na menší výrobný proces/. XO je skrátka kripel a už o tejto téme viac nechcem hovoriť. Resolution gate kauzu týmto považujem za uzatvorenú.