недеља, 30. септембар 2007.

Programiranje igara -pogled ispod haube

Umesto uvoda

Ako ste igrali neku igru i pomislili kako nešto nije trebalo ovako već onako, ili bi ste vi to sigurno bolje odradili, imate dobre predispozicije da se bavite izradom igara. Naime, jako je bitno da imate svoju ideju i kreativnu viziju onoga što želite da napravite. Međutim, ispod svake vizije pretočene u igru koja vas veže danima ispred ekrana stoji puno mukotrpnog posla koji se dobrim delom oslanja na šablone i ideje koje su drugi već razradili pre Vas. Ako ste imali želju da se
bavite ovom tematikom a niste znali kako i odakle da krenete sada je pravi trenutak.

Šta je u stvari video igra

Da bi ste naučili da pravite igre morate znati šta je to video igra, preciznije šta se sve dešava u kutiji zvanoj računar dok uživate u svojoj omiljenoj igri. Pokušaću da ovde izložim tu problematiku sa što manje formalnosti ali tako da budete upućeni u što više stvari od suštinske važnosti čije će razumevanje bitno olakšati dalji napredak u ovoj oblasti. Kao i kod svih drugih stvari vezanih za računare, u suštini je sve jako jednostavno ali poprilično sklonjeno od pogleda korisnika tako da on nema puno uvida u to šta se u stvari dešava. Predstavićemo ovde osnovni koncept računara, preciznije onaj deo koji je od suštinske važnosti za igre.

Suština video igre je u interakciji između korisnika i računara. I računara i korisnika može biti više ili jedan ali koncept je isti. Postoje ulazni uređaji, u našem slučaju tastatura i/ili miš i eventualno džojstici, džojpedi i ko zna šta sve još. Računar obrađuje akcije korisnika, tj. igrača i sve to smeštaju negde u memoriji zavisno od toga ko ih obrađuje. Ono što je kod igara najatraktivnije a samim tim i najvažnije je grafika. Za grafiku su u računaru zaduženi procesor i grafička kartica. Osnovna funkcija grafičke kartice je da iscrtava sliku na ekranu i to joj je u početku bila i praktično jedina namena. Sve je radio procesor pa je tako i pripremao svu grafiku, obrađivao je i spremao za prikaz na ekranu.

Savet za surfere: Više informacija o istorijatu i razvoju grafičkih kartica na: http://accad.osu.edu/~waynec/history/lesson15.html

Savremene grafičke kartice su ipak mnogo više od uređaja za pretvaranje podataka koje šalje procesor u signal koji monitor prikazuje kao sliku. U stvari one poseduju svoj procesor, zvani grafički procesor ili GPU. Kao što je podela rada bila od velike važnosti za ljudski rod tako je i podela rada unutar računara omogućila veću specijalizaciju uređaja a samim tim i bolje performanse unutar određenih tehnoloških mogućnosti. Današnji grafički procesori u velikoj meri rasterećuju glavni procesor tako da mu omogućuju da se podrobnije bavi drugim aspektima igre kao što su veštačka inteligencija protivnika, obrada dinamičnog okruženja itd. Naravno, grafički procesor ne zna sam šta treba da radi tako da ga je potrebno najpre podesiti a zatim mu i obezbediti podatke sa kojima će raditi. Sve ovo je posao onoga koji pravi igru. Dakle, u samoj igri se u suštini sve vrti u krug. Računar reaguje na akciju korisnika (ako je ima) izračunava sve promene u igri i u skladu sa njima vraća nazad korisniku (igraču) povratne informacije da bi sve počeo ponovo ispočetka. Naravno, ima stvari koje se dešavaju nezavisno od akcije korisnika (po inerciji) tako da je potrebno stalno osvežavati prikaz koji igrać dobija na ekranu (npr. lopta će ići po inerciji i posle udarca igrača, u realističnim okruženjima će se stalno dešavati nešto nezavisno od igrača, voda će se talasati, ptice će proletati itd.)

Unutar grafičke kartice

Sada ćemo se malo detaljnije pozabaviti samom grafičkom karticom, pošto je ona jedan od najvažnijih delova hardvera koji se koristi za igre a pritom najčešće ljudi nemaju baš jasnu predstavu o tome šta se tu stvarno dešava. Sa današnjim razvojem kartica može se slobodno reći da je grafička kartica «računar unutar računara» jer poseduje sve osnovne delove računara kao što su procesor i memorija. Ovde neću detaljno zalaziti u detalje grafičkog hardvera ali ćemo se vratiti na ovo kad god nam bude bilo od značaja prilikom rada sa istim. Izložiću samo ukratko šta se sve dešava u toku obrade podataka pre nego što se pojave na ekranu.

U svakoj igri osim samih parametara igre koristićemo i neke podatke koji će predstavljati grafiku igre. U slučaju da je igra dvodimenzionalna imaćemo sprajtove a ako je okruženje trodimenzionalno (3D) imaćemo teksture i modele. Detaljnije o njima sledeći put. U slučaju sprajtova, koji su u stvari gotove slike, stvar je poprilično jednostavna. Sve što treba uraditi je pozicionirati sprajt na ekran i eventualno ga transformisati. Može se transformisati promenom veličine (npr. kada objekat treba da izgleda bliži ili dalji) ili rotacijom. Takođe, pošto je svaki sprajt, kao i bilo koja druga slika predstavljena u računaru, pravougaonog oblika moramo se pobrinuti o transparenciji (providnosti) kako bi ispravno prikazali nepravougaone oblike.

Kod 3D grafike stvar je daleko složenija, pogotovu kada se uzme u obzir razvoj tehnike renderovanja (iscrtavanja slike na ekranu). Najstarija 3D grafika bila je prikazivanje «žičanih mreža» (wireframe) objekata iscrtavanjem samo njegovih ivica. Ovo se postizalo relativno jednostavno iscrtavanjem linija na ekranu.

Danas se koriste kompleksne realistične 3D scene koje uključuju detaljne 3D modele. Ovi modeli se sastoje iz podataka definisanih u 3d prostoru. Da bi se objekat prikazao na ekranu potrebno je uraditi nekoliko stvari.

Model je tipično napravljen u nekom programu i definisan je pozicijom svojih delova (tačaka tj. temena) u prostoru. Kako je model najčešće napravljen nezavisno od ostatka scene (uzmimo npr. model koji se pojavljuje u više nivoa) mora se transformisati njegova pozicija u tzv. prostor scene (world space). Dalje, obzirom da se scena uvek posmatra iz neke tačke u prostoru scene, potrebno je transformisati objekat u prostor pogleda (view space). Kasnije se objekat senči u zavisnosti od svetla u sceni, odsecaju se delovi koji neće biti prikazani na ekranu, ostatak se projektuje na ekran i rasterizuje. Rasterizacija je postupak u kome se podaci vezani za objekat pretvaraju u oblik pogodan za prikaz na ekranu. Naime, zbog preciznosti pozicije temena su date u realnim brojevima sa decimalama. Svim transformacijama i dalje se dobijaju realni brojevi, koji se moraju pretvoriti u cele brojeve koji odgovaraju pikselima (tačkama na ekranu). Drugim rečima, rasterizacijom se konačno određuje da li na mestu nekog piksela treba iscrati dati objekat ili ne. Na sreću ovaj postupak se stalno ponavlja za veliki broj objekata tako da je automatizovan kod modernih kartica. To znači da će uz podešavanje malog broja parametara kartica najveći deo posla obaviti sama. Ipak, kada dođemo do naprednih tehnika videćemo da ćemo morati da se detaljnije pozabavimo ovim problemom.

Optimizacija

Sve dosad rečeno deluje jako jednostavno, i čovek bi mogao pomisliti da je potrebno samo napraviti scenu (ili još bolje naći nekoga ko će to uraditi bolje od Vas), zadati kartici da iscrtava objekte tj. modele i baciti se na programiranje ponašanja protivnika. U praksi to ipak nije tako. Iako današnji hardver može da izvrši toliko operacija da vam se zavrti u glavi, čovek uvek hoće da izvuče najbolje i najviše od postojećeg. U tom smislu se vrše razni postupci da bi se ubrzalo izvođenje igre a samim tim i omogućilo detaljniji prikaz na ekranu. Na primer, možemo ubrzati izvođenje ako unapred znamo koji objekti nisu trenutno vidljivi pa ih samim tim nećemo ni slati grafičkoj kartici. Takođe, objekte koji su u daljini i relativno mali na ekranu ne moramo iscrtavati sa svim detaljima kao kada su u prvom planu. Optimiziacije možemo vršiti i u drugom pravcu radi rasterećenja procesora i smanjenja izračunavanja. Tako se dinamika scene može računati samo za bliske objekte, ili se ponašanje protivnika može uzimati u obzir samo za one koji u datom trenutku mogu da utiču na igrača. Dve su bitne stvari o kojima moramo voditi računa prilikom optimizacija. Prvo je njihova isplativost. Kako optimizacija uglavnom znači čuvanje dodatnih informacija, ovaj višak prostora mora biti kompenzovan dobitkom na vremenu. Takođe moramo voditi računa i da igra ne bude previše prostorno (memorijski) zahtevna. Druga stvar je logička ispravnost optimizacije. Drugim rečima, ako je reč o iscrtavanju mora se voditi računa o tome da igrač praktično ne primeti da uopšte ima optimizacije, tj. da vizuelno ne nedostaje nijedan deo scene. Kada je reč o optimizaciji ponašanja igre mora se voditi računa da se objekti ponašaju ispravno u situaciji kada je igrač u mogućnosti da utiče na njih. Naravno, uvek se moraju napraviti neki kompromisi, i to je suština programiranja igara, ali tako da se očuva utisak o okruženju kao celini. Na primer, sigurno vam nije bilo previše bitno ako ste videli da se u daljini neki objekat malo «zabrljao», ili ako ste pucali sa više stotina metara u zapaljivo bure i ništa se nije desilo, ali ako ste prošli blizu nekog objekta koji se loše iscrtava, ako tekstura nije ispravna, ili ako ste došli do protivnika nekim drugim putem i videli da stoji u mestu ne reagujući na vaše prisustvo, verovatno ćete to navesti kao veliku manu igre.

1 comments:

Анониман је рекао...

Hey i am suuper boy