Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   31 użytkowników zagłosowało

    1. 1. Gdzie świętować urodziny GMCLANu


      • Warszawa (bo w centrum)
      • Szczecin (bo tam mieszka Ranma i narodził się GMCLAN)

    Żeby zagłosować w tej ankiecie, prosimy się zalogować lub zarejestrować. Zobacz temat
  • 0
Ignatus

Optymalizacja

Pytanie

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 ??

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

4 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 1

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×