Mastodont Opublikowano 16 Stycznia 2023 Udostępnij Opublikowano 16 Stycznia 2023 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 Więcej opcji udostępniania...
SimianVirus7 Opublikowano 16 Stycznia 2023 Udostępnij Opublikowano 16 Stycznia 2023 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; Uzjel 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 17 Stycznia 2023 Administratorzy Udostępnij Opublikowano 17 Stycznia 2023 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; } Uzjel 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Mastodont Opublikowano 18 Stycznia 2023 Autor Udostępnij Opublikowano 18 Stycznia 2023 W dniu 16.01.2023 o 20:32, SimianVirus7 napisał(a): ( u mnie przy 100 obiektach to uzyskanie 1000fps więcej... dużo.) Sporo 😮 Tak czy siak dziękuję wam za porady :) 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ę