2024. május 3., péntek

Gyorskeresés

Kihajtja-e? (a technikai háttér)

Írta: | Kulcsszavak: gpu . cpu . játék . kihajtja

[ ÚJ BEJEGYZÉS ]

...Vagy is még is van ilyen, de nem abban a formában ahogy egyesek elképzelik. Nem lehetséges egy cpu-t összepárosítani egy gpu-val, mivel a kihajtja-e téma legfőképp a programtól függ!

Rendernél egy dolog van ami használja a cpu-t, ez a drawcall (rajzolási hívás), ilyenkor küld infot a cpu a gpu-nak hogy rajzoljon ezt meg azt.
Ideális esetben, játékbeli objektum (ember, autó, fa, stb) modellje 1 node-ból (egy objektum aminek mondjuk 3d maxban 1 neve van, tehát össze van attacholva, nem kell a benne szereplő elemeknek poligonban kötődni egymáshoz), és 1 db textúrából áll. Na most bonyolultabb dolgoknál ez nem olyan egyszerű, mert sok játék a node nevek alapján különbözteti meg a kirajzolandó LOD-okat, és azt hogy mi ez az objektum (pl az animált objektumokat általában külön node-ban és külön névvel kell azonosítani a modellen belül).
És persze a textúrázás is néha olyan kínszenvedés, hogy több textúrát kell használni.
Tehát a fent említett drawcall minden egyes node-ra megtörténik, annyiszor ahány külön textúrája van. Tehát egy 4 node fejenként 1 textúrával= az 4 drawcall. 4 node fejeknét 2 textúrával már 8 drawcall.
Sőt azt hiszem vannak olyan textúrázás eljárások, ahol a bonyolult shaderek miatt 1 textúra is több drawcallt jelent, de ebbe még nem ástam bele magam.
És ez a drawcallozás a mumus! Sokkal fontosabb ennek féken tartása mint a poligonszámé (ami valójában háromszög szám, mert poligon számmal dobálódzni értelmetlen, mert akárhány oldala lehet).

Tehát mint látható a drawcallok száma erősen függ attól hogy modellezték a játékban szereplő dolgokat (node és textúra szám), másrészt a játék jellegétől függ. Pl egy nagy nyílt területes sok irányban bejárható játékban nagyon sok objektum van, és mint írtam 1 objekt több node-ot és textúrát is tartalmazhat, így tehát a drawcall szám: látható objektumok mennyisége * átlag node szám modellenként * átlag textúra szám nodeonként. Szóval látható hogy egy elrontott modell, óriási mértékben növelheti ilyen nyílt területes játékokban a drawcallok számát, és ha a cpu eléri a max kihasználtságot, akkor nem jut info a gpu-nak, az fps meg esik.
Viszont kis területes, pl cső fps-eknél a cpu kevésbé számít, hiszen kevés objektum van benne kevés drawcall kell, viszont ezeket durva részletességgel látják el, így egyértelmű hogy a gpu-t fárasztja jobban.

Azt hogy mennyi drawcallt tud kipréselni magából a cpu, azt lehet növelni több magos támogatással, amikor is 1 teljes mag kapja a rendert (drawcallozgatás), és a többire el van osztva minden más. Elvileg a directx11 egyik legnagyobb vívmánya az, hogy nem csak egy szálon és 1 magon lehet renderelni, hanem többön ellentétben a régebbi verziókkal.

Tehát nincs ilyen hogy egy cpu kihajtja a gpu-t fixen. Lehet egyik játéknál bőven kihajtja, másiknál meg messze nem. A fentebb írt formulától függ a dolog.
A legegyszerűbb módja a kihajtás vagy nem kihajtás megállapítására, ha előveszünk egy gpu monitorozó programot, ami írja hogy mennyi a gpu kihasználtság, és közben megnyitjuk a feladatkezelőt, erős figyelemmel nézzük (ha összesítésben azt írja 50% a cpu kihasználtság, az nem biztos hogy azt jelenti hogy mind2 magot 50%-ra használja, hanem gyakrabban azt hogy 1 mag 100%-on, másik meg alig kihasználva, ez a szám ~25% körüli ugye 4 magnál mert a 100%/4 meglepő módon 25.)
Szóval ha azt látjuk 1 mag fullra van terhelve, és a játékban kevés az fps (vsync alatti szám tehát <60) és a gpu terhelés nem 90%+ akkor bizony nem hajtja ki.
Fordított esetben meg a gpu a kevés.
Ha egyik sem full terhelt és be van kapcsolva a vsync akkor jó géped van. A vsync egyébként nem direkt fps csökkentő mint ahogy az fps huszárok hiszik, hanem arra való, hogy egyrészt csökkentse az lcd-k tearingjét, másrészt hogy 60 fps-nél (ami bőven elég az emberi szemnek), ne rendereljen többet, így erőforrást megtakarítva.
Van olyan játék, ami ki tudja írni a drawcall számot, sőt akár azt is hogy melyik szál mivel foglalkozik, mennyire terheli a magokat, de sajnos ez ritka. Állítólag az nvidia perfmonitor is ki tudja írni ezeket, ati-ra nem találtam megoldást ha a program maga nem tudja.

Szóval a lényeg, felejtsük el az "ez nem hajtja ki a gpu-dat" dolgokat, mert bizony főleg attól függ milyen játékot akar játszani az illető. Ha valaki Arma2-zik, vasútszimezik, repszimezik az sok drawcallt jelent, ott nagyon fontos az erős cpu mert valószínűleg mindig az lesz a korlát, de csőfpseknél pl 2033-mas metró, fear 76. része, sót a codoknál is (mert erősen korlátozott a játéktér), a gpu fog jobban számítani, ha ez nem így van de pozitív irányban (túl jól fut) az vagy valami csodálatosan optimalizált kódot jelent, ha hasonló de negatív irányban az meg valami csodálatosan elcseszettet jelent (pisikszel lehet ilyeneket művelni).

Hozzászólások

(#1) Jofi81


Jofi81
őstag

A címből kimaradt egy j betű.

Egyébként érdekes cikk, ma is tanultam valamit. Köszi!

[ Szerkesztve ]

(#2) szablya


szablya
tag

Ezt érdemes volt elolvasni. :K

Madarat tolláról, embert desktopjáról. | Inni és inni adni. | Ellopták az alisok a tankot. | Az igazi tuningos Prescott kávét iszik. - all by szablya | "Igazat az igazaknak, zárják be a hazugokat!" \m/

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.