TO_mek Opublikowano 29 Listopada 2012 Udostępnij Opublikowano 29 Listopada 2012 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 Więcej opcji udostępniania...
TO_mek Opublikowano 1 Grudnia 2012 Autor Udostępnij Opublikowano 1 Grudnia 2012 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę