Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

Witam

Ostatnio zabrałem się za zrobienie gry typu minecarft 2D z generatorem.

Napisałem generator i wszystko śmigało do momentu kolejnego "update".

Dodałem naprawdę nie wiele, a gra zwolniła o 15 fps O.o

 

LINK: http://speedy.sh/9QK6W/generator.gmk

 

Zawarłem specjalny skrypt, usunąłem zbędne akcje i nic.

Może ktoś z was powie mi co zrobić aby ta gra zaczęła chodzić szybciej.

 

Jeśli niezrozumiale to przepraszam.

Opublikowano

@Raalsky: źle postawiłeś - deaktywuje obiekty poza viewem.

 

@TheNishishiro: powiedz dokładniej, co zrobiłeś, zanim zaczęło się ścinać, bo wróżyć nie potrafimy. Sprawdź też, co się stanie, jeśli usuniesz wszystkie generatory, gdy skończą generować (dodaj instance_destroy na końcu ich eventu Create).

Opublikowano

Dobra już jest wszystko ok.

Jednak źle zrobiłem deaktywację obiektów i tyle się ich narobiło, że zaczęło mulić (tak myślę)

Użyłem takiego skryptu w step player:

 

//Oszczędzanie pamięci

 

xx = player.x;

yy = player.y;

instance_deactivate_region( xx - 450, yy - 450, 900, 900, false, 1 );

instance_activate_region( xx - 450, yy - 450, 900, 900, true );

 

//Lista niezbędnych

instance_activate_object( player );

Opublikowano

Sorki nie patrzałem w argumenty i myślałem że to x2 i y2, ale to nie zmienia faktu że powinno być instance_deactivate_all, bo bezsensownie dektywuje i aktywuje ten sam obszar.

  • 4 tygodnie później...
Opublikowano

Mam teraz następny problem -_-

Jestem o krok od prawie nieskończonej mapy, mam nowy generator i tak dalej, jednak w pewnym momencie obiektów robi się na tyle dużo, że ich dezaktywacja nic nie daje :unsure:

Chciałem zniszczyć obiekty poza widokiem choćby i tylko np. kamień... Niszczenie się udaje ale nie mam pojęcia jak mam je wczytać z powrotem w swoje miejsca, męczę się z tym już kilka dni i nie potrafię.

Pewien użytkownik (innego forum gdzie wstawiam newsy o grze) podsuną mi sposób z zapisywaniem do tablicy pozycji obiektów i potem ich wczytania ale nie chciał mi pomóc, a ja nie mam najmniejszego pojęcia jak robić te tablice ani jak mam zapisać pozycje blisko 40 tyś. obiektów O_o i odczytać je w swoich miejscach...

Błagam pomocy.

Opublikowano
Mam teraz następny problem -_-

Jestem o krok od prawie nieskończonej mapy, mam nowy generator i tak dalej, jednak w pewnym momencie obiektów robi się na tyle dużo, że ich dezaktywacja nic nie daje :unsure:

Chciałem zniszczyć obiekty poza widokiem choćby i tylko np. kamień... Niszczenie się udaje ale nie mam pojęcia jak mam je wczytać z powrotem w swoje miejsca, męczę się z tym już kilka dni i nie potrafię.

Pewien użytkownik (innego forum gdzie wstawiam newsy o grze) podsuną mi sposób z zapisywaniem do tablicy pozycji obiektów i potem ich wczytania ale nie chciał mi pomóc, a ja nie mam najmniejszego pojęcia jak robić te tablice ani jak mam zapisać pozycje blisko 40 tyś. obiektów O_o i odczytać je w swoich miejscach...

Błagam pomocy.

 

Tablica :) W każdym obiekcie do usunięcia daj w step sprawdzanie odległości od gracz( obiektu za którym posuwa się view ), jeśli wynosi np. 2000 to usuwaj. Jeśli gracz zbliża się do jakiejś pozycji gdzie nie ma wczytanej kawałka mapy to wczytaj.

Opublikowano

Znaczy nie mogę dezaktywować gdy spadną fps ;) bo spadają na samym początku gry -_- że jak usunę z poza view kamień, który zajmuje 50% mapy -_- mapa może generować się bardzo długo (praktycznie do końca room'a)

 

Skowron1993

A w jaki sposób mam sprawdzić czy na przykład w tym miejscu nie ma obiektu.

Bo moje myślenie jest mniej/więcej takie, że pamiętanie obiektów zajmuje najwięcej pamięci więc tworzenie dodatkowego w obiektu w miejsce usuniętego kamienia byłoby bezsensowne... W tym tkwi problem, jak program ma sprawdzić czy w tym miejscu jest obiekt czy nie?

Opublikowano

Może po prostu każdemu obiektowi który ma znikać/pojawiać się daj w draw, step i czego tam jeszcze używasz:

GML
if( distance_to_object( obj_za_ktorym_lata_view ) > 2000 )

{

draw_sprite( sprite_index, 0, x, y );

}

Opublikowano

Tak z tym, że dezaktywacja (z tego co wiem) prowadzi do ominięcia kolizji, stepów czy rysowania grafik... jednak nie zwalnia miejsca, który zajmował obiekt więc nawet zdezaktywowane przy tej ilości na tyle spowalniają grę, że to nie ma za bardzo sensu.

Dlatego pragnę usunąć obiekt poza widokiem, a kiedy się znajdzie to stworzyć go w tym miejscu.

Próbowałem czegoś takiego, że tworzyłem obiekt który podążał za graczem w pewnej odległości i niszczył obiekty, a potem je tworzył jednak wychodziło to beznadziejnie bo jak np. skoczyłem to to tworzyło mi obiekt w zupełnie nie tym miejscu... Potem, znalazłem jeszcze 100 minusów ale okazało się, że z tym sposobem zyskałem na fps bez dezaktywacji najliczniejszej grupy obiektów

screen:

Bez-tytuu_rhwreex.png

 

Takie małe pytanie jeszcze, bo wcześniej używałem takiego kodu:

GML
if(distance_to_object(player) <= 500)

{

instance_create(x,y+32,stone) //tak do y+4000 -_-

}

jednak generowało cały czas gdy warunek był spełniony, czy dałoby się przekształcić/coś zrobić aby skrypt wykonał się raz przy tym warunku,a potem drugi raz po odejściu i powrocie w te miejsce?

 

No a obiekt stone miał:

GML
if(distance_to_object(player)>500

{

instance_destroy();

}

Opublikowano

co do :

 

 

 

 

GML
if(distance_to_object(player) <= 500)

{

instance_create(x,y+32,stone) //tak do y+4000

}

 

 

 

 

zrob tak :

 

GML

 

if (distance_to_object(player) <=500 and ready=true

 

{

 

for (i=1; i<=125; i+=1;)

 

{

 

if place_free(x,y+32*i)

 

instance_create(x,y+32*i,stone);

 

}

 

ready=false;

 

}

 

 

o to ci chodzi? potem jak sie znajdzie w tym miejscu to ready=true i znowu bd tworzylo klocki w stone zaznacz solid i tyle;D

  • 2 miesiące temu...
Opublikowano
Czyli mogę powiedzieć, że na tym kończy się wspaniałość Game Maker'a i pojawia się brutalna rzeczywistość :( ?

Szkoda, trzeba czekać na nowe wersje :/

 

Nie oglądałem Twojego kodu ale wydaje mi się, że zwaliłeś całkowicie podejście do tematu. Polecam artykuł na stronie epomoce.pl. Konkretnie seria artykułów "Giganty Świata 2D". Tam jest rewelacyjne podejście do tematu ogromnych map a z zamieszczonego screena z Twojej gry wydaje mi się, że artykuł idealny dla Ciebie.

Ja tylko zawsze zastanawiałem się jak w tak gigantycznej mapie rozwiązać problem "życia" - jeśli gdzieś daaaaleko poza viewem jakiś załóżmy królik ma być zeżarty przez wilka bo akurat jeden z drugim wszedł sobie w paradę to jak to zasymulować jak przecież te obiekty są w danej chwili zupełnie nieaktywne i są tylko danymi w tablicy :)

Opublikowano

Po prostu symulować te obiekty, które są aktywne. Ewentualnie sprawdzać, czy właśnie uaktywniane obiekty mają odpowiednie warunki do istnienia na swojej pozycji: jak nie, to usuwać.

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