Skocz do zawartości
Ice Cube

FPS zwalnia!

Rekomendowane odpowiedzi

Siema

w mojej grze pociski wystrzelone przez gracza bardzo zwalniają gre ,czy macie jakieś pomysły jak to rozwiązać?

 

pocisk/step:

 

//potwor 1


// sprawdzamy kolizje z wrogami
with (obj_potwor1) {
    if (place_meeting(x, y, other.id)) {
        // kolizja nastąpiła, ale w 2D, sprawdźmy wysokość pocisku
        if (other.z < 24) {
            with (other) {
                // niszczymy pocisk
                                instance_destroy();
            }
            // niszczymy wroga
            atak=1
                      // przerywamy blok 'with'
            break;        }    }}

 

//potwor 2
// sprawdzamy kolizje z wrogami
with (obj_potwor1) {
    if (place_meeting(x, y, other.id)) {
        // kolizja nastąpiła, ale w 2D, sprawdźmy wysokość pocisku
        if (other.z < 24) {
            with (other) {
                // niszczymy pocisk
                                instance_destroy();
            }
            // niszczymy wroga
            atak=1
                      // przerywamy blok 'with'
            break;        }    }}

 

 

takich potworów mam 20 sztuk kod jest bardzo podobny

 

próbowałem to rozwiązać :

if distance_to_object(potwór1)<5 or distance_to_object(potwor2)<5 {kod kolizji}

 

ale to także nie przyniosło efektów..

proszę o pomoc :)

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

W poprzednim temacie napisałem co można by zrobić, ale powtórzę:

 

Dnia 11.12.2018 o 21:18, Konrad-GM napisał:

Widzę, że wkraczasz w bardziej złożone kwestie z programowaniem fizyki w grach :) Podejrzewam, że problem jest z dużą ilość wrogów na mapie - albo użyj dezaktywacji obiektów poza pewnym rejonem dookoła gracza funkcjami z rodziny instance_(de)activate_*, albo porzuć stosowanie flagi solid i oprogramuj swoją obsługę kolizji w Collision Event-ach.

 

Nie mam pojęcia, jak GameMaker obsługuje kolizje i czy stosuje coś na wzór spatial partitioning - quadtree, spatial hash itp., może ktoś bardziej obeznany w tych kwestiach z GMem by podpowiedział. Ale mógłbyś też posilić się własną implementacją sprawdzania kolizji używając quadtree czy prostszym w implementacji spatial hashing (quadtree vs spatial hashing).

 

PS. Możesz skrócić swój kod with(obj_potwor) do with(obj_potwory) ustawiając wrogom tego samego rodzica parent obj_potwory.

 

BTW. Nazwa tematu nie jest dostatecznie opisowa.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Czy dobrze rozumiem że w obiekcie "obj_potwor1" masz kod "with (obj_potwor1)" ? No to tworzy jakąś niezłą pętelkę samą do siebie i tutaj może być problem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
12 godzin temu, gnysek napisał:

Czy dobrze rozumiem że w obiekcie "obj_potwor1" masz kod "with (obj_potwor1)" ? No to tworzy jakąś niezłą pętelkę samą do siebie i tutaj może być problem.

to jest cały kod pocisku /step

 

i tam w step jest umieszczone 20 potworów

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
15 godzin temu, Konrad-GM napisał:

W poprzednim temacie napisałem co można by zrobić, ale powtórzę:

 

 

BTW. Nazwa tematu nie jest dostatecznie opisowa.

jest deaktywacja/aktywacja potworów ,ale problemem jest obj_pocisk . przy wystrzeleniu ponad 40 pocisków(karabin) zwalnia z fps50 do fps 10

,nawet jak potworów nie ma w pobliżu

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

problem pojawił się jak zamiast collision zrobiłem w stepie placemeeting

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

pomijając temat

 

ZDROWYCH,WESOŁYCH ŚWIĄT dla całej Game Makerowej rodziny :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Może w drugą stronę jednak zrób, że pocisk sprawdza if place_meeting(x,y,obj_potwor) ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Pomysł @gnysek może się sprawdzić, ale zamiast with i place_meeting spróbuj użyć collision_circle w step event obj_pocisk:

var potwor = collision_circle(x, y, 8, obj_potwor, true, true);
if (potwor != noone) {
    if (z < 24) {
        with (potwor) {
            instance_destroy();
        }
    }
}

Wartość parametru rad = 8 możesz modyfikować wedle uznania, żeby dostosować promień kolizji.

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Po wielkich testach stwierdzam,że place_meeting bardzo obciaża procesor w porównaniu do collision_circle

i to prawie dziesięciokrotnie!!

 

dzięki za pomoc i dosiego roku :)

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jak masz ustawione jakieś precyzyjne maski kolizji to może obciążać bardzo mocno. place_meeting bazuje na porównywaniu masek ze sobą.

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

×