Skocz do zawartości

Grawitacja dużej ilości drobnych obiektów w GM i FPS


Rekomendowane odpowiedzi

Witam!

Mógłby ktoś podsunąć pomysł jak rozwiązać taki problem:

- room 1024x768 (room_speed=60)

- obiekt kostka4x4_obj o wielkości 4px na 4px posiadający grawitację oraz w zdarzeniu kliknięcia lewym klawiszem myszy instance_destroy()

- obiekt podloga32x4_obj o wielkości 32px na 4px bez grawitacji, z kolizją na kostka4x4_obj.

- room wypełniam szczelnie jeden obok drugiego obiektami koastka4x4_obj czyli powstaje jedna wielka masa kostek z grawitacją oraz na samym dole rooma kładziemy podłogę z obiektów podloga32x4_obj.

 

Uruchamiam to na mocnym kompie C2D 3,2GHz z dobrą grafą i dużą ilością RAMu i mam 3-4 FPS. Jak dodam jeszcze kolizje obiektów kostka4x4_obj z samą sobą to mam 0 FPS i praktycznie zwis.

 

Pytanie czy GM jest na tyle powolny, że w nim nie ma szans na zrobienie gry z grawitacją wszystkich obiektów (kostek), gdzie "podkopanie" (zniszczenie kostki) powodowałoby "obsunięcie" kostek położonych wyżej? Już nawet nie chodzi mi o symulowanie fizyki czyli efekty tupu sypiącego się piasku ale o zwykłe spadania kostek w obrębie zniszczonej kostki (wszystkie kostki powyżej powinny spaść o wysokość 1 kostki w dół).

A może ja się biorę za to od złej strony.

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbuj aktywować tylko te obiektu, którym jest potrzebna grawitacja.
Jeśli to miał być symulator proszku to więcej byś an tym stracił niż zyskał ;p

 

Problem tutaj tkwi nie tyle w grawitacji (która i tak nie wyrobi przy tylu obiektach) co w samym sprawdzaniu kolizji. Gm sprawdza kolizje na zasadzie każdy z każdym co daje nam piękną złożoność kwadratową i dla nawet 1k obiektów z których każdy sprawdza kolizję z każdym otrzymujemy 1 milion sprawdzeń kolizji (najpierw pewnie sprawdza po bboxie, ale milion to i tak dużo, dla 50k będzie 2,5kkk).

 

Dla czegoś takiego albo się robi octree albo (jeśli obiekty są _w miarę_ równych rozmiarów) po prostu przechowuje się obiekty w siatce _kwadratów_, gdzie każdy kwadrat jest kolekcją obiektów które się w nim znajdują, i wtedy sprawdzamy kolizje tylko z tymi w aktualnym oraz w sąsiednich kwadratach.

Ale jako, że pisanie własnej kolizji w gmie byłoby głupotą: nie, nie da się ogarnąć takiej liczby obiektów w gmie. Ani gml Ci na to nie pozwoli (bo jest za wolny) ani nie będziesz miał jak sprawdzać kolizji (wbudowane się nie nadadzą a swojej nie możesz napisać (patrz: gml jest za wolny)).

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli to miał być symulator proszku to więcej byś an tym stracił niż zyskał ;p

 

Problem tutaj tkwi nie tyle w grawitacji (która i tak nie wyrobi przy tylu obiektach) co w samym sprawdzaniu kolizji.

 

No jeszcze tak myślę czy może nie zrezygnować z obiektów, grawitacji kolizji a zrobić to na tablicy dwuwymiarowej przechowującej współrzędne kostek (albo raczej originów sprajtów). W momencie klikania myszką mógłbym usuwać z tablicy dany "obiekt" oraz zmienić położenie wszystkich tych nad tym zniszczonym i ponownie je rysować. Jedyny warunek to taki, że klocki muszą być ustawiane na roomie na siatce 4x4. Opadanie klocków następowałoby od razu o 4px.

Odnośnik do komentarza
Udostępnij na innych stronach

Kolumny proszku?

256 kolumn, w każdej jedna zmienna: wysokość kolumny.

Gdy kwadracik spadnie na kolumnę, zwiększa wysokość kolumny o 1, a sam się niszczy.

 

 

Może i głupie, ale lepsze niż 50k kwadracików.

E: zrobiłem już to w domu, tylko że to działa nie na zasadzie Powder Game, ale na zasadzie tworzenia gór z kamyków. Jak będę miał internet, to prześlę.

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ę...