Skocz do zawartości

Optymalizacja... Jak to zrobić?


TheNishishiro

Rekomendowane odpowiedzi

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.

Odnośnik do komentarza
Udostępnij na innych stronach

Wywala błąd, że brak pliku E:\Moje gry\sto.gif.

 

Stawiam, że nie używasz funkcji do "usypiania" obiektów, które są poza viewem - https://gmclan.org/index.php?wiki=article&zm=101. Polecam też na początek ogarnąć ten syf, bo nazewnictwo masz piekielne i ciężko mi tam było się połapać :D.

Odnośnik do komentarza
Udostępnij na innych stronach

@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).

Odnośnik do komentarza
Udostępnij na innych stronach

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 );

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

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();

}

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 miesiące temu...
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 :)

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