Skocz do zawartości

collision_circle


Mastodont

Rekomendowane odpowiedzi

Jeżeli w okienku jest około setki obiektów i wszystkie co 1,5 sekundy przeszukują teren dookoła siebie za pomocą collision_circle_list() o promieniu 30-100 pikseli w poszukiwaniu konkretnego typu obiektu, to jest to mocno zasobożerne? Jeżeli tak, to czy istnieje szybszy i bardziej optymalny sposób na takie działanie?

Odnośnik do komentarza
Udostępnij na innych stronach

Oszem, według mojej wiedzy jest zasobożerne.
Ja znalazłem na to dwa rozwiązania w swoim projekcie.
a) zmiana collision_circle na collision_rectangle - Wiem, że nie zawsze jest to możliwe, ale np. jeśli robisz pole widzenia przeciwnika, to czy circle czy rectangle, efekt jest bardzo do siebie podobny. ( u mnie przy 100 obiektach to uzyskanie 1000fps więcej... dużo.) 

b) To co najbardziej zwiększa wydajność, to przerzucenie tej funkcji na ten "konkretny typ obiektu" który ma Ci znaleźć. Przykład:
- masz 100 przeciwników którzy patrolują teren i sprawdzają czy widzą obiekt gracza np. oPlayer, a więc masz 100 razy collision_circle. Możesz odwrócić sytuacje i to graczowi dać collision_circle czy widzi przeciwników, jeśli tak, zrób np. oEnemy.widze_gracza = true; Wtedy collision_circle występuje tylko 1 raz;

Pamiętaj, że zawsze możesz zrobić rodzica obiektów, np. nie musisz pisać
 

collision_circle_list(x, y, 100, oEnemy1);
collision_circle_list(x, y, 100, oEnemy2);
collision_circle_list(x, y, 100, oEnemy3);
collision_circle_list(x, y, 100, oEnemy4);

tylko wrzucić jako child do pustego obiektu, np. oEnemies
i wtedy
 

collision_circle_list(x, y, 100, oEnemies);

 

PS: Listę tworzymy w create, jeśli damy to w innym miejscu, step czy draw, będzie się ona tworzyć bez końca aż zapełni całą pamięć RAM. Tworzenie jej w step i od razu niszczenie jej przy pomocy ds_list_destroy(), kiedy już zrobi swoje, też negatywnie wpływa na fps;

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jest zasobożerne, natomiast sposób optymalizacji zależy od tego, co tam się dzieje. Nie wiemy czemu tych sprawdzeń jest tak wiele, ale skoro są co 1,5 sekundy, to zacząłbym od zastanawiania się, czy wszystkie muszą robić to w tej samej sekundzie. Może mogą robić to po kolei - w każdym kroku jeden lub kilka? 1,5 sekundy przy 60 FPS to 90 eventów step, zatem niemal wspomniana setka.

 

Nie wiem czy to się przyda, ale podam ogólny kod na wykonywanie kodu co klatkę obrazu przez n instancji danego obiektu (w przykładzie: 3):

 

// CREATE:
obecnie = 0;
ile_co_klatke = 3;

// STEP:
var liczba_instancji = instance_number(nazwa_obiektu);
for(var i = obecnie; i < min(liczba_instancji, obecnie + ile_co_klatke); i++) {
  with(instance_find(nazwa_obiektu, i)) { // instance_find() pozwala wybrać n-tą instancję danego obiektu
    // tutaj kod, który chcemy wykonać - jesteśmy w "with", więc kod wykonuje się w kontekście wybranej instancji
    // może być też skrypt, lub odwołanie do eventu, np. user event tejże instancji
  }
}
obecnie = i; // ponieważ wykonało się "i++", wartość będzie o 1 większa niż mniejsza z liczb w funkcji min()
// nie zwiększamy tej wartości w pętli, gdyż zaburzyłoby to wynik funkcji min()

if (obecnie == liczba_instancji) {
  obecnie = 0;
}

 

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