Kezdőoldal » Számítástechnika » Programozás » Unity3d-ben az objektumok...

Unity3d-ben az objektumok Update metódusa elvileg minden frame alatt meghívódik. Namármost ez nagy objektum szám esetén (pl stratégiai játék) nem lassítja le nagyon a játékot?

Figyelt kérdés
Milyen megoldások léteznek performancia javításra?
2015. dec. 30. 17:49
 1/2 anonim ***** válasza:

Így van, minden frame-re meghívódik.

Bővebben a futtatási sorrendről:

[link]


Mit nevezel nagy számnak (pl stratégiai játéknál)?

Milliós nagyságrendű hadsereget? Ha belegondolsz hogy még a fák update-je is hívódik meg ezen kívül még sok dolognak van update-je. És persze közben még a fizikai motor is számol.


A scriptek eleve lassabbak kicsit, de még ettől eltekintve sem kell számolnunk a lassulással. Főleg hogy csak ezres nagyságrendben kell gondolkodnunk.


A Unity3D egy egész jól megírt motor, az objektumok elég alacsony szinten van kezelve, ez többek között azt jelenti, hogy elosztott erőforrásokra vannak bontva a különböző komponensek. Ez persze az OOP szöges ellentéte, de vegyük figyelembe, hogy játék motorról van szó.


Még a particle effecteknél sincs próbláma egy százezres számmal sem, úgy van megírva a motor, hogy képes legyen kezelni a rövid életű objektumokat. Rövid életű objektumoknál a motor tartja számon a halott és születő részecskéket és megspórolja a memória allokálás időigényét, úgy hogy egy inaktív (halott) objektumot módosít és életre hívja.


Ami igazán lassú lehet ha Unity-s játékot írsz az az objektum létrehozás (GameObject.Instantiate). Ilyenkor érdemes minél részletesebb prefabokat használni és a kieső objektumokat sem szabad egyből Destroyolni.

2015. dec. 31. 12:59
Hasznos számodra ez a válasz?
 2/2 anonim ***** válasza:

Lassítja, de hogy kerülöd ki? Nagyon nagy egységszámnál(pl total war) tipikusan csak szakaszokkal foglalkoznak(ez lehet 1-200 fős is), így a kritikus számítási feladatokat csak a szakaszokra, nem pedig minden egyes egységre kell kiszámolni(~hiába látsz 10k egységet, simán lehet, hogy csak 80-100 szakasszal számol a program), a szakasz osztály ellenőrzi, hogy esetleg kell-e updateelni az egyes egységeket(persze ha mindegyiket egyszerre kell updateelni akkor ugyanott vagy, de erre valószínűleg kb soha sem kerül sor).


Általánosságban elmondható, hogy ha rengeteg objektummal kell dolgozni akkor érdemes egy eseményrendszert használni, valamivel kényelmetlenebb a fejlesztés, de ha jól írod meg csak akkor számol, ha kell neki.


Az első válaszoló által írt object pooling nem minden esetben használható, de valóban, az is sokat tud javítani a teljesítményen(és elvileg márciusban végre kapunk gpu instancingot is, nagy tömegek létrehozására pofátlanul hasznos lesz - gondolkodni ugyan nem fognak, de ekkora mértéknél a legnagyobb gond jelen pillanatban nem az update, hanem a drawcall).

2016. jan. 2. 09:08
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!