Skocz do zawartości

Optymalizacja ilości pocisków


TO_mek

Rekomendowane odpowiedzi

Witam!

Załóżmy, że:

- mam 15 dział, które generuje 10 pocisków na sekunde każde.

- każdy pocisk po 5ciu sekundach lotu rozbija się na kolejnych 10 odłamków a te utrzymują się przez 3 sekundy

 

czyli po 8miu sekundach ciągłych strzałów na ekranie mam: 15dział x 10pocisków x 5sek lotu x 10odłamków x 3sek trwania = ~22 tyś. obiektów i fps ladnie leci w dół. Do tego dochodzi koło 500 przeciwników i w każdym kontrolowana jest kolizja z pociskiem. Oczywiście to wartości maksymalne i rzeczywista ilośc obiektów wyświetlanych na ekranie będzie sporo mniejsza ale też duża.

 

Co tu zoptymalizować poza ograniczeniem ilości samych obiektów? Nie chcę wyrzucać lotu pocisku w kierunku celu na rzecz strzelania punktowego (strzał polegający na jednorazowym sprawdzaniu kolizji przez collision_line).

 

 

Czy ma sens zamiast tworzyć te wszystkie obiekty, zrobić jeden obiekt rysujący wszystkie pociski na ekranie oraz przechowujący obliczenia aktualnych pozycji tych wszystkich pocisków i sprawdzający collision_point dla każdego z tych pocisków co steep? Coś w ten deseń tyle że razy ilość pocisków (max ~22K):

GML
deltax+=lengthdir_x( spd, dire )

deltay+=lengthdir_y( spd, dire )

draw_sprite(pocisk_spr,0, room_width/2 + deltax, room_height/2 + deltay);

if collision_point(room_width/2 + deltax, room_height/2 + deltay, alien_obj,0,0) > 0 then "kasuj aliena oraz dane o pocisku z tabeli"

 

PLUS do tego jakaś tablica czy grid przechowująca te wartości (kierunek, prędkość i aktualne pozycje x,y) dla każdego z pocisków.

Kod powtarzany w jakiejś pętelce for i=1 to ilosc_pociskow, oczywiscie co steep.

 

Będzie to szybsze czy wręcz odwrotnie, jeszcze opóźni całą grę.

Odnośnik do komentarza
Udostępnij na innych stronach

Odpiszę sam sobie.

 

Tworzenie pocisku w GlobalMiddleButton

GML
ds_queue_enqueue(global.q_pocisk, x+lengthdir_x(8,direction)); //x pocisku

ds_queue_enqueue(global.q_pocisk, y+lengthdir_y(8,direction)); //y pocisku

ds_queue_enqueue(global.q_pocisk, direction); //kierunek

ds_queue_enqueue(global.q_pocisk, 5); //predkosc pocisku</span>

 

Rysowanie w DRAW

GML
{// PETLA OBSLUGI POCISKOW NIEOBIEKTOWYCH

var _xx, _yy, _di, _sp, _id;

while !ds_queue_empty(global.q_pocisk) {

_xx = ds_queue_dequeue(global.q_pocisk);

_yy = ds_queue_dequeue(global.q_pocisk);

_di = ds_queue_dequeue(global.q_pocisk);

_sp = ds_queue_dequeue(global.q_pocisk);

_xx+=lengthdir_x(_sp, _di);

_yy+=lengthdir_y(_sp, _di);

draw_sprite(pocisk_spr,0, _xx, _yy);

_id:=collision_point(_xx, _yy, alien_obj,1,0);

if _id > 0 then {

score+=1;

with (_id) instance_destroy();

}else {

if !((_xx > room_width) or (_xx<0) or (_yy>room_height) or (_yy<0)) then { //jesli nie wyszedl za room to zapamietaj pozycje

ds_queue_enqueue(_q_pocisk, _xx); //x pocisku

ds_queue_enqueue(_q_pocisk, _yy); //y pocisku

ds_queue_enqueue(_q_pocisk, _di); //kierunek

ds_queue_enqueue(_q_pocisk, _sp); //predkosc pocisku

}

}

}

ds_queue_copy(global.q_pocisk, _q_pocisk); //Kopiuje tymczasowa kolejke do glownej

ds_queue_clear(_q_pocisk);//czysci kolejke tymczasowa

}

 

Testy jednak wychodzą sprzeczne. Tworząc ok 500 obiektów obcych oraz około 2000 pocisków mam różne wyniki na różnych kompach. Dla przykładu komp i5 750 3GHz z 8GB RAMu, winda 7 64bit i grafą GeForce GTX260 z prędkością początkową ponad 1000 FPS (przy 17 obiektach na start), lepiej obsługuje wersję na DRAW o jakies 10FPS niz komp C2D E8600 3,3GHz z 4GB RAM, winda XP i grafiką GeForce 8800GTS 512 (S istotna literka w tym modelu) z prędkością pocz. ~500 FPS. Inny komp zbliżony do tego słabszego ale z windą 7 64bit home także na korzyść obiektów.

Możliwe, że jeszcze coś można przyspieszyć w rysowaniu (więcej tam obliczeń niż samego rysowania), może coś innego zastosować niż kolejki, lepiej zapisać warunki itp.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...