Jeste li se ikada zapitali kako su igre sa starog NES-a mogle stati u medij koji u sebi sadrži 2kB radne memorije i 8 kB – 1 MB ROM memorije? Neke od ovih starih igara pružale su podjednako (u velikom broju slučajeva i više) sati kvalitetne zabave, što je pomalo apsurdno kada uzmete u obzir da jedan Call of Duty: Black Ops 3 zauzima preko 50 GB podataka. Jasno, igre danas vizualno i funkcionalno predstavljaju potpuno novu razinu zabave u odnosu na one od pred 25 godina i više, no morate priznati da je impresivno kako su programeri u ono vrijeme uspijevali natrpati toliko sadržaja na staromodne kazete.


Ključ cijele priče bila je sinergija igara i hardvera koji ju pokreće

Igre su za kućne konzole u prosjeku dolazile u kazetama kapaciteta od 64 do 128K na koje je sve moralo stati – grafika, animacije, zvuk i pogon u obliku programskog koda – koji to sve povezuje u jednu zabavnu cjelinu. Za očekivati je da su i konzole u sebi sadržavale određeni dio potrebnih resursa poput funkcija, hardverske podrške i softverskih instrukcija, ali je i dalje impresivna količina sadržaja koja je morala nekako stati na tada raspoložive formate u obliku kazeta. Veličina prosječne .JPEG slike često nadmašuje potrebnih 128 KB prostora potrebnog za jednu kompletnu igru, što zbilja postavlja pitanje – kako je to uopće moguće? Kako se jedna bezvezna fotografija s interneta usuđuje zauzeti više digitalnog prostora od cijele siline NES hitova?

Odgovor na to pitanje nije toliko jednostavan, no sigurno je da NES igre nisu funkcionirale na tako banalni način. Programeri su imali kompleksnu zadaću programiranja (ma nemoj) čitavih algoritama kako bi se raspoloživa radna memorija dinamički iskorištavala u hodu, dok igrač zapravo igra i još bitnije, nije svjestan čitavog cirkusa koji se odvija kako bi igranje bilo ugodno iskustvo. Pogledajmo o čemu se zapravo radi.

Programiranje u asembleru je vjerojatno najbitnija stavka

Budući da se radi o programiranju na vrlo primitivnoj razini gdje se naredbama direktno upućuje čip u zadatak koji treba odraditi. Svako računalo sadrži mikroprocesor koji upravlja aktivnostima vezanima za aritmetičke, logičke i kontrolne funkcije, s time da svaki od mikroprocesora sadrži i vlastiti set instrukcija za prethodno navedene funkcije. Binarni „programski jezik“ predstavlja osnovni računalni jezik, no on jednostavno nije prikladan za programiranje te tu nastupa asembler kao prva razina sučelja prikladnog za čovjeka.

Glazba se generira usput, što znači da nije nigdje lokalno spremljena, već je i ona dio programiranog dijela igre. Moguće je spojiti mali zvučnik direktno na jedan od pinova na mikroprocesoru, rezultat čega možete vidjeti u videu ispod koji predstavlja brutalan primjer 1-bitnog zvuka.

Posebno kreirani algoritmi čija je glavna uloga upravljanje podacima na način da dinamički izmjenjuju svoju lokaciju kako bi se sva raspoloživa memorija iskoristila doslovce do zadnjeg kilobajta. Ovi algoritmi često se koriste za elemente poput grafike i animacije likova, bitmapa i slično.

Ovisnost o mogućnostima hardvera također preuzima značajan dio tereta sa samog medija. Primjerice, konzole su prije dolazile s kompleksnim zvučnim čipovima koji su na sebi imali integrirane algoritme za procesuiranje zvuka na temelju drugih ulaznih informacija. Na ovaj način se drastično povećavaju mogućnosti za dodavanje sadržaja u igru bez da isti postoji fizički na kazeti – zapravo se radi o setu instrukcija koji traži hardversku podršku konzole kako bi odradio svoju funkciju.

Za optimalno smanjivanje veličine samog programa, važno je eliminirati velike mreže podataka, konstanti, varijabli i bilo kakvih drugih tipova fiksnih veličina koliko god je moguće. Raspoloživi prostor potrebno je ispuniti kodom koji zapravo nešto generira uz podršku konzole, gdje je opet važno naći ravnotežu između kompleksnosti tih operacija budući da se igra mora odvijati glatko.

Train Escape to Normandy, The_8
Train – Escape to Normandy

Emulacija trodimenzionalnog prostora u dvodiomenzionalnim okvirima smatra se pravom iluzijom.Lažni 3D efekti mogu se postići koristeći dinamičke 2D slike koje se gibaju po unaprijed definiranoj brzini. Tzv. 2.5D, vrlo popularan u 90-ima, može ostaviti uvjerljiv ukupni dojam ako se dobro odradi, dok je za pravi 3D očit problem bio nedostatak fizičkog prostora. Dobar primjer ovakvog pristupa programiranju jest Train – Escape to Normandy, igra koja je impresionirala sve vlasnike starog Komodorca i pokazala moć drugačijeg pristupa programiranju 2D igara.


Prenosimo i članak Davea Baggeta, jednog od dvojice programera zaslužnih za Crash Bandicoot na PS1, u kojem možete pročitati iskustvo gore navedene optimizacije iz prve ruke. Dave je u više navrata rekao kako je brdo PlayStation 1 igara na malene CD medije stalo uz pomoć čiste sreće. 


Mnoge od gore navedenih metoda koriste se i danas

Gore navedene metode za optimiziranje konačne veličine programske datoteke koju nazivamo “igra” korištene su naizmjenice; rijetko koja igra je primjer gdje se koriste sve od njih. Razlozi za ovo mogu biti razni, od perspektive igrača, hardverskih ograničenja, određenih knjižnica programskih pravila i slično. Do dan danas bilježimo enorman rast razumijevanja optimizacije programskih datoteka, iako se to možda i ne vidi na komercijalno uspješnim igrama poput Grand Theft Auta, Call of Dutya i sličnih. Ovdje se zapravo radi o drugačijoj problematici budući da je grafički prikaz ipak preuzeo najveći dio konačne težine igre, dok su programske metode optimiziranije nego ikad.

Suvremeni primjer za usavršenu optimizaciju prikazan je u videu ispod, gdje je programska datoteka koja izvršava animaciju ispod 64 KB (što znači da bi teoretski stala u Komodorca. Ludnica!).

Download možete pronaći pod ovim linkom


Današnje igre možda izgledaju impresivno, no klasici su testirali granice hardvera

Razvoj igara je, otkad iste postoje, bio pothvat koji je zahtijevao ogromnu posvećenost detaljima i značajne vještine u više područja, od pisanja skripte za priču, određivanja grafičkog identiteta, marketinga, predviđanje serijala povrh silnog programiranja i optimizacije. Impresivno je kako su programeri stare škole nalazili kreativne načine za maksimalno iskorištavanje raspoloživog hardverskog kapitala, što je definitivno poguralo tehničku stranu današnje industrije igara u pozitivnom smjeru. Danas se u mnogim slučajevima razvoj igara podcjenjuje i marginalizira budući da postoje konkretni alati poput GameMakera koji vam dopuštaju da razvijete interaktivnu igru u doslovce par sati.

Kako vrijeme bude odmicalo vjerujemo da će i ovakvi gotovi „programi za programiranje“ igara biti bogatiji značajkama te da će igre zbilja biti jednostavno razvijati što se tehničke strane tiče. To bi u najboljem slučaju značilo da se autori mogu usredotočiti na dobru priču ili neke druge tehničke detalje osim programske optimizacije. Ovakva rješenja su u svakom slučaju dobra stvar budući da se širi aktivna programerska publika koja se više ne mora preznojavati oko toga kako će igru strpati u nekoliko stotina kilobajta memorije.

Ostavite komentar

Vaša adresa e-pošte neće biti objavljena. Obavezna polja su označena sa *