TheNishishiro Opublikowano 29 Listopada 2011 Udostępnij Opublikowano 29 Listopada 2011 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 Więcej opcji udostępniania...
Raalsky Opublikowano 29 Listopada 2011 Udostępnij Opublikowano 29 Listopada 2011 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 Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 29 Listopada 2011 Udostępnij Opublikowano 29 Listopada 2011 @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 Więcej opcji udostępniania...
TheNishishiro Opublikowano 29 Listopada 2011 Autor Udostępnij Opublikowano 29 Listopada 2011 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 Więcej opcji udostępniania...
ediepl Opublikowano 29 Listopada 2011 Udostępnij Opublikowano 29 Listopada 2011 Tak mi się chyba wydaję że powinno być: instance_deactivate_all( 1 ); instance_activate_region( xx - 450, yy - 450, xx + 900, yy + 900, true ); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
karolo320 Opublikowano 29 Listopada 2011 Udostępnij Opublikowano 29 Listopada 2011 nie, powinno być instance_activate_region( xx - 450, yy - 450, 900, 900, true ), bo trzeci i czwarty eagument to dlugosc i szerokosc. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 29 Listopada 2011 Udostępnij Opublikowano 29 Listopada 2011 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheNishishiro Opublikowano 27 Grudnia 2011 Autor Udostępnij Opublikowano 27 Grudnia 2011 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 Więcej opcji udostępniania...
Skowron1993 Opublikowano 27 Grudnia 2011 Udostępnij Opublikowano 27 Grudnia 2011 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 Więcej opcji udostępniania...
ediepl Opublikowano 27 Grudnia 2011 Udostępnij Opublikowano 27 Grudnia 2011 A "paczałeś" jak to będzie wyglądać w praktyce, fps spadną do 20, deaktywacja to chyba najlepsze wyjście. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheNishishiro Opublikowano 27 Grudnia 2011 Autor Udostępnij Opublikowano 27 Grudnia 2011 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 Więcej opcji udostępniania...
micha_i Opublikowano 27 Grudnia 2011 Udostępnij Opublikowano 27 Grudnia 2011 Człowieku,dezaktywacja właśnie to robi, zapisuje x,y i nazwę obiektu. Wychodzi na to samo, a nawet szybciej(ach te ciągłe operacje na tablicach.). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Skowron1993 Opublikowano 27 Grudnia 2011 Udostępnij Opublikowano 27 Grudnia 2011 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 ); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheNishishiro Opublikowano 28 Grudnia 2011 Autor Udostępnij Opublikowano 28 Grudnia 2011 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: 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 Więcej opcji udostępniania...
kapcior7 Opublikowano 28 Grudnia 2011 Udostępnij Opublikowano 28 Grudnia 2011 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 Więcej opcji udostępniania...
TheNishishiro Opublikowano 28 Grudnia 2011 Autor Udostępnij Opublikowano 28 Grudnia 2011 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 :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 12 Marca 2012 Udostępnij Opublikowano 12 Marca 2012 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 Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 12 Marca 2012 Udostępnij Opublikowano 12 Marca 2012 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ć. 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ę