[ vms @ 03.04.2004. 10:12 ] @
Kada GPU obavlja rendering na ekran? Ono sto bih hteo da postignem je da graficka kartica i CPU rade paralelno koliko je to god moguce. Kako onda treba organizovati kod?
[ Reljam @ 03.04.2004. 11:57 ] @
To se vec tako i desava. Tvoj program daje komande GPUu, koji te komande baferuje i izvrsava paralelno. Naravno, kolicina tog bafera je konacna, tako da mozes da dodjes u situaciju gde tvoj program trazi 'suvise' od GPUa, i onda se tvoj thread blokira u grafickom APIu (Direct3D / OpenGL) dok GPU ne uspe da odradi deo posla iz bafera.

Precizniji odgovor zavisi od toga sta tvoj program radi.
[ vms @ 03.04.2004. 13:00 ] @
Ako moj program izgleda otprilike ovako:

Code:


device->BeginScene();

// slanje podataka na GPU

device ->EndScene();
device->Present(....);


Ocekivao bih da odmah po prijemu komande Present GPU mora da iscrta sve sto sam mu poslao do tada. Meni izgleda da ce CPU morati posle slanja Present() malo da saceka da GPU obavi sve zadate operacije. Deluje mi logicnije da posaljem Present tek posto CPU potpuno spremi novu scenu za slanje. Ipak pri eksperimentisanju sa ovim stvarima nisam primetio neku promenu brzine (mada mozda saljem isuvise jednostavne scene).
[ Reljam @ 03.04.2004. 19:50 ] @
Present ne blokira thread osim u ova dva uslova:

1) Nestalo ti je back buffera u koji crtas, znaci GPU mora da zavrsi rendanje i da izbaci frejm. Ovaj problem mozes da smanjis ako koristis triple buffering, ali time povecavas latency i koriscenje video memorije.

2) Ukoliko je command buffer pun, GPU jednostavno ne moze da primi dalje instrukcije, i onda blokira thread.

Ukoliko se desilo ovo pod 2, paralelno izvrsavanje CPU rada ne pomaze, jer si GPU bound, cak i da izracunas sledeci frejm unapred, opet ces da stallujes kada budes izdavao komande GPUu.

U slucaju pod jedan ima malo vise smisla raditi sve ovo, ali imaj u vidu da ti provedes 40% vremena u drajveru - znaci to sto si izdao naredbe za crtanje ne znaci da se one desavaju paralelno i bez CPU overheada, vec i drajver mora malo da 'misli' o njima, i to trosi CPU cikluse. Ne treba ga dodatno usporavati.

I za kraj, ova dva game loopa su skoro ista (osim sto drugi ima veci latency) i ne resavaju problem:

BeginScene()
Think()
Render()
EndScene()

i

BeginScene()
Render()
ThinkNextFrameWhileCurrentFrameRenders()
EndScene()

Jedini bolji nacin je multithreading, ali paralelizacija je teska stvar za implementaciju, jer implicira sinhronizaciju i otvara sijaset problema u razvoju i odrzavanju koda.

BTW, kako napreduje igra, nema nista novo na sajtu? ;)
[ vms @ 05.04.2004. 00:52 ] @
Inace igrica je veoma uznapredovala u poslednje vreme i verovatno cemo uskoro osveziti sadrzaj na sajtu... Cim bude bilo nekih promena poslacu poruku na forum...