Ignatus Opublikowano 5 Listopada 2017 Udostępnij Opublikowano 5 Listopada 2017 W celu zoptymalizowania gry wstawiłem do alarmu Obj_Player kod ///OPTYMALIZACJA-DEAKTYWOWANIE alarm[7]=30 if (global.processing=false){ instance_deactivate_region(view_xview[0] - 428, view_yview - 428, view_wview[0] + 892, view_hview[0] + 892,false, true); instance_activate_region(view_xview[0] - 428, view_yview - 428, view_wview[0] + 892, view_hview[0] + 892, true); } if (global.processing=true){instance_activate_all() } Działa tak jak powinno, duż większa płynność i stałe 60fps (przy 45 bez tego kodu). Ale teraz pojawia się problem.Mam checkpoint który zapisuje baaaardzo dużo zmiennych różnych obiektów. Uproszczony kod wygląda tak (event kolizji obj_checkpoint z graczem-zostawiłem tylko częśc kodu żeby nie zaśmiecać) global.processing=true instance_activate_all() with obj_token_parent {event_user(0)} with obj_enemy_token {event_user(0)} with obj_items_token {event_user(0)} with obj_weapon_parent {event_user(0)} with obj_broken_items_parent {event_user(0)} with obj_blood_parent {event_user(0)} with obj_door_token {event_user(0)} with obj_fire_token {event_user(0)} with obj_move_objects_token {event_user(0)} global.checkpoint=true saved=true Event_user(0)- zapisuje zmienne-analogicznie przy loadzie odczytuje je. I problem polega na tym że dzieje się tak tylko i wyłącznie w zasięgu aktywacji z pierwszego kodu.Choćbym wstawił 50x activate_all w kazdym miejscu to i tak nic się nie zapisze jak będzie poza zasięgiem.Dodam że save/load działa idealnie kiedy optymalizacja jest wyłączona.Co jest tam nie tak ?? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 6 Listopada 2017 Udostępnij Opublikowano 6 Listopada 2017 Dezaktywacja i aktywacja obiektów co step nie jest wcale optymalizacją. Odpal profiler w debugerze i wtedy próbuj zrobić coś z najbardziej zasobożernymi akcjami. A twój problem pewnie bierze się z tego że instance_activate_all() aktywuje obiekty dopiero na końcu pętli gry, nie od razu. Mógłbyś zrobić w ten sposób że aktywowałbyś wszystkie obiekty i ustawiał alarm na 1. A w tym alarmie wykonywał swoje eventy. Ale to jest łatanie wadliwego podejścia. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 6 Listopada 2017 Administratorzy Udostępnij Opublikowano 6 Listopada 2017 A spróbuj ten pierwszy kod dać do "Begin Step" ? Nie wiem, czy nie ma znaczenia i i tak wszystko jest aktywowane po "End Step", czy jest rozdział aktywacji na te 3 eventy. Jedyne inne rozwiązanie w tej sytuacji jakie mi przychodzi, to na bieżąco do jakiejś tablicy zapisywać pozycje obiektów i zapisywać tablicę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ignatus Opublikowano 6 Listopada 2017 Autor Udostępnij Opublikowano 6 Listopada 2017 Wstawienie save do alarmu który odbywa się 10stepów po instance-activate_all pomogło,teraz działa jak powinno.Dzięki panowie Btw.Jakie są najlepsze metody optymalizacji??Threef dlaczego to co zrobiłem jest błedne,przecież zwiększyło mi to płynność gry o dobre 30% zmiana jest gigantyczna,co w tym jest nieodpowiednie? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 6 Listopada 2017 Udostępnij Opublikowano 6 Listopada 2017 Przy dużej liczbie przypadków to co zrobiłeś wystarcza, ale w pewnym momencie czas jaki procesor spędza na dezaktywację obiektów jest dłuższy niż ich zwykłe istnienie. Albo zbyt często aktywowane i dezaktywowane są obiekty które nie powinny zmienić swojego stanu, bo na przykład i tak są poza view. Używanie dezaktywacji obiektów na ślepo nie jest dobrym rozwiązaniem. To jak stosowanie penicyliny na wszystkie choroby. Czasami powinno się dezaktywować poszczególne sektory room i aktywować tylko to co w zasięgu gracza. Czasami gdy poza view muszą być inne aktywne obiekty które np mają kolizje to nie wolno wcale dezaktywować. Musisz odpalić profiler i sprawdzić co tak spowalnia twoją grę. Dopiero wtedy myśleć co z tym zrobić. Ja sam chyba od 4 lat nie użyłem dezaktywacji. Zawsze zawczasu zapobiegam wąskim gardłom. Wiem że tworzenie 400 particle na raz jest gorsze od zrobienia jednego obiektu który rysuje te 400 particle w pętli. Wiem że najwolniejsze jest rysowanie sprite więc gdy nie potrzebuję wyświetlać jakiegoś obiektu a jest mi on dalej potrzbny to po prostu czynię go niewidocznym. 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ę