PC gaming
Jocurile au avut întotdeauna prioritate în mica istorie a calculatoarelor personale. Daca în anii ‘70-’ 80 erau bazate exclusiv pe text (datorita limitarilor tehnologice), ele au capatat încet-încet un aspect realist prin introducerea elementelor grafice si sonore. Utilizatorii - deveniti astfel gameri - au fost fascinati de asemanarea dintre realitate si jocuri, fiecare generatie de astfel de programe introducând noi elemente care sa captiveze jucatorul, creându-i o adevarata dependenta de lumea virtuala .
Un pas important a avut loc la începutul sfârsitul anilor ’80, odata cu aparitia primelor jocuri 3D sub sistemul de operare MS-DOS. Initial ele erau foarte simple, grafica fiind destul de slaba iar genul abordat era de cele mai multe ori legat de simulari de masini, avioane etc. Apoi, în 1992, când id Software si Apogee au creat Wolfenstein 3D, primul 3D Shooter, industria a explodat. Desi resursele hardware necesare erau la acea vreme destul de mari - pentru o rulare decenta fiind necesar un sistem bazat pe procesorul 80286, 80386 sau, si mai bine, 80486 - producatorii nu s-au sfiit sa lanseze tot mai multe jocuri care impresionau orice utilizator al calculatoarelor, nu neaparat pasionat. Era jocurilor 3D era abia la început. Urmasul lui Wolfenstein 3D a fost Doom, urmat de diverse alte titluri la fel de cunoscute: Heretic, Hexen, Duke Nukem, Quake si altele, iar jocurile simulatoare de Formula 1 precum Grand Prix 2 sau Speed Haste tineau si ele pasul, oferind grafica si gameplay din ce în ce mai realiste, mai apropiata de pistele reale de masini. Necesarul de hardware era însa în crestere, o placa grafica rapida punându-si amprenta substantial asupra performantelor obtinute. Performante care erau definite atât de numarul de cadre pe secunde afisate (fps) cât si de setarile efectuate de utilizator asupra calitatii; astfel, pe un sistem performant, nivelul de detalii putea fi crescut la maxim fara ca fluenta jocului sa aiba de suferit ; în schimb, pe un sistem lent, nici chiar setarea acestui parametru la minim nu era suficient pentru obtinerea unui numar decent de cadre pe secunda.
Sa ne legam putin modul în care aceste jocuri erau create. Procesorul sistemului era obligat, pentru fiecare cadru, sa calculeze pozitia obiectelor din spatiul virtual, dupa care sa le afiseze pe ecran, pixel cu pixel, placa grafica neoferindu-i suport în acest sens. De exemplu, pentru desenarea unei linii, procesorul trebuia sa calculeze pozitia fiecarui pixel pentru a-i furniza placii grafice coordonatele necesare. Dezavantajele erau foarte mari: pentru ca jocul sa se desfasoare fluent, era necesara mentinerea calitatii imaginii la un nivel scazut, în principal prin pastrarea rezolutiei standard VGA (320x240) cu doar 256 de culori ; în plus, era imposibila dezvoltarea de efecte spectaculoase. Privit din zilele noastre, un asemenea joc ar parea la fel de demodat pe cât pare o masina de scris în fata unei dactilografe care tasteaza în Word. Si totusi, în 1995 a început revolutia...
Hardware-ul...
Pentru a elimina problemele amintite anterior, erau necesare doua elemente: unul hardware si altul software. Primul s-a materializat prin aparitia acceleratoarelor grafice, mai întâi 2D si apoi 3D. Sa vedem ce ofereau acestea în plus.
Chip produs de Cirrus Logic de pe o placa grafica antica Am precizat anterior ca, doar pentru desenarea unei linii (un exemplu aleator, probabil cel mai simplu), procesorul trebuia sa realizeze toata operatia, placa grafica neputând colabora în nici un fel, singurul lucru de care era capabila fiind acela de a-si umple propria memorie cu pixeli, unul câte unul. În schimb, o placa acceleratoare detine numeroase functii ce înlesnesc cele mai uzuale operatii, procesorul sistemului fiind degrevat de o mare parte din munca. Astfel, pentru desenarea aceleiasi linii, procesorul comunica placii grafice coordonatele initiale si finale, placa unind singura aceste puncte. În mod asemanator se realizeaza desenarea cercurilor, a poligoanelor, umplerea suprafetelor etc. (Termenul de accelerator este folosit uneori pentru a desemna o placa separata, ce detine numai aceste functii speciale, pentru a functiona necesitând o placa grafica normala.)
O categorie aparte o reprezinta acceleratoarele 3D, care sunt capabile sa creeze, la comanda procesorului, imagini în trei dimensiuni. Sarcina lor este, de aceasta data, sa deseneze obiecte (ce se reduceau, într-un final, la poliedre, sfere sau alte suprafete determinate de anumite functii matematice, peste care erau aplicate texturi, acestora din urma aplicându-se, la rândul lor, diverse efecte). Astfel jocurile au capatat un aspect mult mai realist, putând fi marita si rezolutia la minimul considerat decent, 640x480, iar numarul de culori a ajuns la 65 de mii sau chiar 16 milioane.
Al doilea element era reprezentat de software-ul necesar exploatarii acestor acceleratoare, reprezentat de drivere si API-uri.
...si software-ul
Windows 3.x era foarte limitat în privinta graficii. În primul rând, afisarea nu era realizata direct precum în MS-DOS, ci prin intermediul interfetei GDI, extrem de lenta. Astfel, doar jocuri precum Solitaire puteau fi rulate decent, alte jocuri de complexitate medie, ce rulau fara probleme sub DOS, nu avea nici o sansa în mediul Windows. Si aceasta chiar daca aveam hardware-ul necesar (placa grafica rapida, cu accelerator) pentru ca nu exista nici un element al sistemului de operare capabil sa exploateze puterea acestuia.
În domeniul profesional existau diverse API-uri, cel mai popular fiind OpenGL, pe care Microsoft l-a implementat doar în Windows NT (sistem de operare la care aveau acces, de obicei, doar utilizatorii care nu aveau nimic în comun cu jocurile si nici cu puterea slaba a sistemelor din acea perioada de început a anilor ‘90). De aceea s-a nascut WinG, satisfacând pe moment necesitatea ce se poate deduce din rândurile de mai sus. Era vorba de un API capabil sa afiseze imaginile de tip bitmap mult mai rapid decât GDI. De asemenea, compania SciTech Software a introdus API-ul WinDirect, care facilita portarea jocurilor DOS sub Windows. Pentru rularea fluenta a secventelor video (nu se putea vorbi de filme în acea vreme), acelasi Microsoft a creat, în colaborare cu Intel, interfata DCI (Display Control Interface), ce îmbunatatea performantele cu pâna la 30% aplicând aceeasi metoda: ocolind lentul GDI. Toate aceste interfete de programare au avut o viata relativ scurta si nu au afectat puternic industria deoarece MS-DOS era cel mai folosit sistem de operare în acea perioada. Windows 95 a schimbat multe, de la mentalitatea utilizatorului pâna la industria jocurilor. Si toate acestea datorita lui DirectX.
Epoca de început a lui DirectX
Desi versiunea originala de Windows 95 nu avea inclus acest API, zvonurile despre lansarea iminenta a sa existau din plin. În septembrie 1995 (la doar o luna dupa lansarea lui Win95) si-a facut aparitia DirectX 1.0, un API extrem de primitiv si „bolnavicios”, ce a avut o viata scurta. Componentele sale erau DirectDraw, DirectSound, DirectInput si DirectPlay. Sa le luam pe rând.
DirectDraw se dorea a fi înlocuitorul celor doi predecesori, WinG si DCI, asadar se ocupa cu tot ce însemna afisare bidimensionala, fiind practic un manager al memoriei placii grafice. Un manager bun. Primul lucru remarcat de programatori a fost lipsa compatibilitatii cu DCI, ceea ce a reprezentat un minus major pentru moment, aceasta având în vedere ca DCI era suportat hardware de placile grafice, iar rularea filmelor pe acestea si prin intermediul DirectDraw nu putea fi realizata decât printr-o emulare care scadea drastic performantele.
DirectSound. Sarcina sa era evidenta: tot ce este legat de sunet poate fi intermediat, pentru o mai buna performanta, de acest API. Astfel, sunetele dorite pot fi mixate fara ca rezultatul sa fie redat în boxe cu latente mari. Cum ar fi fost daca atunci când împuscam adversarul zgomotul pistolului sa fie auzit dupa o secunda? Cât despre celelalte doua, DirectInput si DirectPlay, nu avem de spus decât ca ele erau concepute sa coordoneze tot ce tine de dispozitivul de intrare (joystick, mouse, tastatura), respectiv de dispozitive de comunicatii care intervin inevitabil în cadrul jocurilor multiplayer (modem, retea etc).DirectX 1.0 nu a avut nici o sansa de a fi folosit la scara larga. Problemele (inclusiv de stabilitate) pe care le avea si perioada de tranzitie de la platforma DOS la cea Windows au împiedicat dezvoltarea jocurilor pentru noul API de la Microsoft. Situatia nu s-a schimbat cu mult nici odata cu a doua versiune a lui DirectX, ce a sosit rapid, fiind inclusa si în prima revizie a lui Windows 95, OSR2. Problemele de care suferea erau grave si nici functionalitatea nu era exceptionala, asadar cel putin din punctul de vedere al producatorilor de jocuri, DirectX nu era înca o optiune decenta.
DirectX 2 a introdus API-ul Direct3D, azi poate cel mai important element al lui DirectX, oferind suport pentru nou-aparutele placi acceleratoare 3D, atât integrate în placa grafica cât si separate de aceasta (precum era 3Dfx Voodoo Graphics). Totusi, 3D-ul acelei vremi juca un rol complet secundar, o dovada fiind faptul ca doar versiunea 2.0a a lui DirectX a suportat acest API, cu alte cuvinte un mic update a oferit suport, treaca-mearga, pentru accelerarea tridimensionala.
DirectX 3 a fost prima versiune utilizabila. Tehnologia MMX a primit suport din partea DirectX, cresterile de performanta, desi nu foarte evidente, au contribuit la obtinerea unui realism de exceptie în jocuri. Pentru acea vreme, desigur. Totodata, DirectSound a fost suplimentat de DirectSound3D, o extensie destinata accelerarii hardware a sunetului.
În 1996, Microsoft s-a vazut în postura de a dicta viitorul erei 3D. Nu ar fi pentru prima data când gigantul software încearca sa modeleze piata dupa propriile interese si nici nu trebuie privite cu ironie aceste rânduri. Este un fapt absolut normal pentru orice mare companie, doar ca nu întotdeauna puterea unui gigant este suficienta. Astfel s-a nascut proiectul Talisman, a carui filozofie era reducerea latimii de banda necesara, adica ceea ce „omora” performanta, folosindu-se randarea de tip tile-based, similara celei dezvoltate de PowerVR. Din pacate pentru compania din Redmond, proiectul a fost un esec total, în primul rând datorita faptului ca cel care a ajuns #1 pe piata hardware a consumatorilor de jocuri 3D a fost 3Dfx cu ale sale chip-uri Voodoo si al sau API Glide. DirectX a cazut într-un con de umbra datorita esecului acestei initiative, cu atât mai mult cu cât o serie de producatori au primit licenta de a fabrica chip-uri grafice compatibile cu acest standard, de exemplu Cirrus Logic si Trident, chip-uri care nu s-au dovedit a fi prea competitive. Unii spuneau, mai în gluma, mai în serios ca sunt mai degraba decelatoare decât acceleratoare grafice. Mai inspirata a fost miscarea altor doua mari companii, S3 si ATi, care nu au construit chip-uri dedicate lui Talisman ci unele generice, compatibile la modul general cu DirectX.
DirectX 4 a fost sarit, nu neaparat din ratiuni de marketing ci pur si simplu pentru ca proiectul DirectX 5 a parut mult mai interesant dezvoltatorilor de software, a cincea versiune aducând o serie de noutati marcante. În primul rând, API-ul Direct3D a fost dotat cu facilitati suplimentare care cresteau atât calitatea imaginilor 3D cât si viteza de randare, iar DirectSound3D a oferit suport pentru efectele accelerate hardware, companiile Creative si Aureal putând astfel sa-si puna în valoare tehnologiile EAX si respectiv A3D. Iar daca sistemul de operare „era de acord” (de exemplu se numea Windows 98), diverse dispozitive pe noul port USB (precum joystick-urile sau interfetele externe de sunet ce se conectau prin acesta) puteau conlucra fara probleme cu DirectX 5. În fine, componenta DirectInput putea acum lucra cu dispozitivele de tip force feedback.
DirectX-ul modern
Aparut în 1998, DirectX 6 ne-a încântat, printre altele, prin facilitatea de single-pass multi-texturing. Deja ne aflam în era 3Dfx, devenit apoi 3dfx. Al doilea accelerator al companiei, Voodoo 2, a oferit aceasta facilitate ce permitea cresterea clara a performantelor în jocuri dar numai cu suport din partea soft-ului. Alte functii 3D introduse: bump mapping, compresia texturilor, stencil buffers. Imaginile aratau foarte bine, putând spune ca jocurile se aflau suficient de aproape de ceea ce se numeste realism. Procesoarele AMD K6-2 au primit si ele suport software pentru instructiunile 3DNow!, concepute special pentru a accelera jocurile.
DirectX 6.1 a fost un update major. Îmbunatatirile au afectat aproape toate componentele si în plus a aparut una noua: DirectMusic, o interfata facila pentru redarea sunetelor, în special de tip MIDI. Astfel, acum puteau fi stabilite segmente ce urmau a fi redate, loop-uri si alte artificii pentru personalizarea la maxim a acestui aspect deloc de ignorat în cadrul jocurilor.
Aparitia lui DirectX 7 a schimbat axa de rotatie a lumii 3D datorita suportului pentru chip-urile grafice GeForce 256 de la NVIDIA, în acea vreme concurentul direct al lui 3dfx. Aceste chip-uri erau singurele care au avut implementata tehnologia Transform & Lighting (T&L) si astfel 3DMark 2001, sprijinit de DirectX 7, oferea scoruri fabuloase în combinatie cu ele. Cum 3DMark reprezenta principala modalitate de a testa performantele subsistemului 3D al PC-ului, efectele nu s-au lasat asteptate, culminând prin falimentul companiei 3dfx, ce a fost cumparata chiar de al sau concurent, NVIDIA. Nu am speculat faptul ca cele descrise mai sus au reprezentat factorul hotarâtor în aceasta privinta, dar lipsa T&L din partea chip-urilor Voodoo, împreuna cu promovarea de catre Microsoft a acestei tehnologii, au contribuit la decaderea companiei sus-amintite.
DirectX 7 nu s-a oprit la acest aspect; Direct3D a oferit si alte „bunatati”, printre care environment mapping with cubic environment maps, geometry blending, iar DirectSound3D a inclus o crestere a eficientei algoritmilor, rezultând o utilizare mai mica a procesorului pentru generarea de efecte. Nu în ultimul rând, DirectX Media, pâna acum componenta separata - ce era inclusa în fiecare versiune de Windows si destinata redarii filmelor si a animatiilor - a fost integrata în DirectX. Componenta sa esentiala este DirectShow, initial denumita ActiveMovie, fiind practiv succesorul lui Video for Windows din Windows 3.x dar actualizata pentru a face fata tehnologiilor moderne precum QuickTime, Windows Media sau DVD. De asemenea, DirectX Media s-a aflat permanent în strânsa legatura cu DirectX dar si cu tot ce înseamna Internet si HTML, actionând si ca plugin ActiveX pentru a reda animatii în cadrul paginilor web, prin DirectAnimation.
Pixel Shader este cuvântul de ordine al lui DirectX 8, un set de instructiuni capabil sa gestioneze imaginea la nivel de pixel, culoarea acestuia fiind definita în relatie cu mediul înconjurator (de exemplu în functie de sursele de lumina care actioneaza asupra lui). Acest comportament este acum programabil, spre deosebire de efectele generatiilor anterioare de chip-uri grafice ce trebuiau sa se supuna unui set limitat de efecte. Aplicatii directe ale acestui concept sunt scene de natura de o mare complexitate si un mare realism, precum reprezentarea apei sau a focului. Totodata, a opta versiune a API-ului a introdus suportul pentru Vertex Shader programabil ; ca si Pixel Shader, aceasta tehnica este capabila sa creeze un numar nelimitat de efecte dar la nivel de vertex. Altfel spus, nu pixelii sunt cei programabili ci coordonatele corpurilor desenate, efectele fiind, desigur, mai putin spectaculoase; însa uneori este mai eficienta programarea la nivel de vertex si nu de pixel. Tehnica Vertex Shader nu necesita putere foarte mare de lucru, de aceea procesorul o poate emula fara probleme în lipsa implementarii hardware. În schimb, Pixel Shader nu are nici o sansa în acest sens. Trebuie mentionata tot acum si fuziunea dintre API-urile DirectDraw si Direct3D odata cu DirectX 8.
Dupa un update destul de sumar prin DirectX 8.1, a urmat versiunea a noua, ce a introdus Pixel/Vertex Shader 2.0, o extensie a setului de instructiuni standard, prezent în DirectX 8. Desigur, acest fapt a fost datorat implementarii în noile chip-uri grafice (Radeon 9700, GeForce FX) a instructiunilor corespunzatoare. Totusi, schimbarile nu au fost nici pe departe atât de spectaculoase precum în cazul lui PS 1.0. În fine, DirectX 9.0c a oferit Pixel Shader si Vertex Shader în versiunea 3.0, un update care nu a stârnit decât câteva zâmbete. Deja avantajele se lasa asteptate, diferentele dintre calitatea imaginilor randate cu diferite versiuni de Pixel Shader nefiind mari. Aceasta nu înseamna ca extensiile oferite sunt ignorabile, ci faptul ca ele nu pot oferi gamer-ului nimic revolutionar.
Pixel & Vertex Shader
Câteva cuvinte despre noile tehnologii aduse de DirectX 8. Programatorul putea acum sa defineasca asa numitele Pixel Shader-e, adica functii matematice prin intermediul carora era posibila manipularea continutului unui fragment, definind astfel comportamentul sau în timp. Prin fragment întelegem o zona din imagine ce contine pixeli care respecta aceeasi proprietate. Într-un mod similar, Vertex Shader-ul este o functie ce manipuleaza direct obiectele prin coordonatele definitorii ale lor. Daca pâna acum programatorul era limitat la un set standard de functii, odata cu introducerea programabilitatii lui Vertex Shader aceste coordonate pot fi schimbate în orice mod. Deseori, functiile Pixel Shader (PS) sunt „conduse” de cele Vertex Shader (VS), ceea ce este perfect normal, pixelii facând parte din obiecte, iar miscarea acestora din urma este dictata de VS. De exemplu, pentru a determina iluminarea unor pixeli dintr-un poligon, PS-ul necesita informatii precum pozitia poligonului sau orientarea surselor de lumina, aspecte de care este raspunzator VS.
Dupa cum spuneam mai devreme, pentru a functiona, tehnica PS are nevoie în primul rând de suport hardware din partea chip-ului grafic. Fiecare VPU este limitat la o anumita versiune de PS si nu poate rula jocuri/aplicatii concepute exclusiv pentru o versiune superioara, la fel cum nici un procesor care nu suporta instructiunile SSE2 nu va rula soft creat pe baza acestora. Pe de alta parte, suportul trebuie asigurat si de software prin API-ul 3D, în cazul nostru DirectX. Astfel, primul DirectX cu suport PS a fost 8.0, ce era limitat la versiunea 1.1 (cea 1.0 a trecut neobservata, neexistând hardware si software limitat la aceasta), VPU-ul corespunzator fiind GeForce3, în toate variantele sale. DirectX 8.1 a introdus trei noi versiuni: 1.2, 1.3 si 1.4. Primele doua erau suportate de generatia GeForce4 Ti, ultima doar de Radeon 8500 si doar prin emulare. De ce atât de multe versiuni? E suficient sa ne gândim ca fiecare dintre ele consta într-un standard, ce cuprinde o serie de instructiuni. Dupa ce standardul era facut oficial, se astepta un update la API si o generatie noua de chip-uri grafice. Daca pâna la aparitia acestora erau lansate versiuni noi, era efectuat update-ul corespunzator pentru ca atât DirectX cât si VPU-ul sa suporte noul standard.
Extensiile aduse de PS 1.4 sunt considerate de tip RISC, pe când PS 1.1 - 1.3 opereaza în stil CISC. Cu toate aceste avantaje, PS 1.4 nu a avut o viata prea lunga, el fiind înlocuit relativ rapid de PS 2.0, un motiv principal fiind lipsa suportului din partea hardware-ului - doar Radeon 8500/9100 suporta acest standard si doar prin emulare, el fiind mai rapid în modurile PS 1.1 - 1.3. Desigur, orice VPU modern suporta acest standard, eventual împreuna cu cele superioare, deci compatibilitatea „în jos” este asigurata, programatorul putând decide de la caz la caz ce versiune sa foloseasca.
Pixel Shader 2.0 a continuat evolutia spre RISC, el fiind suportat de VPU-uri moderne precum generatia GeForce FX 5800/5900/6800 si Radeon 9700/9800/X800 (am enumerat doar variantele de top). Însa realismul scenelor 3D nu a crescut nici pe departe similar trecerii de la DirectX 7 la DirectX 8, acum punându-se accent mai mult pe detalii, partea cea mai importanta, care „ia ochii” - precum randarea extrem de realista a apei - fiind deja realizata.
A treia versiune de PS si VS a dat si mai multa libertate programatorului, fiind eliminate diverse limitari, crescându-se precizia culorilor, iar tehnici speciale precum Dynamic branching (salveaza performanta prin eliminarea pixelilor inutili), Shader anti-aliasing (elimina diversele artefacte nedorite ale imaginii) sau Back-face register (permite iluminari dintr-un singur pas) nu fac decât sa sporeasca posibilitatile de obtinere a efectelor deosebite si sa creasca performantele atinse.
Urmatorul DirectX se va numi pur si simplu WGF (Windows Graphic Foundation) si este asteptat pe parcursul acestui an, pe acest API fiind bazata întreaga interfata a urmasului lui Windows XP, Longhorn. El va unifica lucrul în 2D cu cel în 3D, oferind totodata Pixel & Vertex Shader 4.0. Dar despre toate acestea vom vorbi la momentul aparitiei.