Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

Jak zoptymalizować liczbę FPS w grze? Przede wszystkim myślę o androidzie.Np gra ogólnie dużo lepiej się prezentuje na 60fps ale na niektórych urządzeniach się totalnie dusi (schodzi do 10) - ale kiedy jest 30 to wszędzie jest w miarę ok- ale ogólnie efekt gorszy.Kiedyś ktoś na shoucie wspominał o tym że można to jakoś ogarnąć na sztywne wartości.Pytanie jak?

Odnośnik do komentarza
Udostępnij na innych stronach

Poszukaj artykułów na temat delta time w GM. Zobacz czy to jest to czego szukasz. Jak nie to istnieje jeszcze opcja optymalizacji gry. Odpal debugger poczytaj jak odpalić profiler i sprawdź co przymula twoją grę. Może gdzieś niepotrzebnie sprawdzasz kolizję co step a wystarczyłoby sprawdzić raz?

Odnośnik do komentarza
Udostępnij na innych stronach

Gra jest względnie dobrze zoptymalizowana bo od początku o to dbam (jak umiem:p).Kwestia taka - po kompilacji na androida- na 6 różnych urządzeniach, na 4 jest 30/30 fps na 2 pozostałych (dużo gorszych modelach- stary telefon i budżetowy tablet) jest w granicach 20-25fps.Kiedy zwiększe do 60fps to na tych 4 jest 60/60 i gra nabiera wtedy dopiero przyjemnej płynności ale z koleji na słabszych to spada do 10-15 i jest już całkiem nie grywalna.Gdzie znaleźć złoty środek?

Odnośnik do komentarza
Udostępnij na innych stronach

Gra jest względnie dobrze zoptymalizowana bo od początku o to dbam (jak umiem:p).Kwestia taka - po kompilacji na androida- na 6 różnych urządzeniach, na 4 jest 30/30 fps na 2 pozostałych (dużo gorszych modelach- stary telefon i budżetowy tablet) jest w granicach 20-25fps.Kiedy zwiększe do 60fps to na tych 4 jest 60/60 i gra nabiera wtedy dopiero przyjemnej płynności ale z koleji na słabszych to spada do 10-15 i jest już całkiem nie grywalna.Gdzie znaleźć złoty środek?

 

Dodać naklejkę - minimalne wymagania sprzętowe, gra nei jest przeznaczona na suszarki, loków i lodówki.

Odnośnik do komentarza
Udostępnij na innych stronach

Optymalizacja:

-Jeden obiekt może zarządzać wieloma elementami

-Jak masz ściany itd. To zamiast mieć na nie oddzielne obiekty zrób z ich grafik tilesety i używaj pojedyńczego niewidzialnego obiektu jako kolizja. Użyc możliwości rozciągania obiektów aby użyć tak mało jak to możliwe.

Przykład:

 

Tutaj masz przykład "zwykły", czyli kładziesz mase obiektów będących podłogą i ścianami. W tym przykładzie na screenie jest 100 bloków. To 100 razy sprawdzenie kolizji. Z czego, nie oszukujmy się, połowy nawet nie da się dotknąć więc są bezużyteczne.

2ce54197a1.png

 

Tutaj masz przykład zoptymalizowany: Bloki to tylko obrazki - Background zapisany jako tileset. Prawdziwa kolizja jest z niewidzialnym w grze(ale widzialnym w edytorze) obiektem solidnym. Dobrą praktyką jest ten obiekt zrobić jak najmniej obstrukcyjny swoim wyglądem, abyś widział co jest pod spotem. Może być np. półprzeźroczysty. TUTAJ ILOŚĆ OBIEKTÓW WYNOSI ZALEDWIE 7. Dzięki możliwościom room editora, obiekt został rozciągnięty tak aby pokryć jak najwięcej solidnej przestrzeni.

46b1457b4a.png

Odnośnik do komentarza
Udostępnij na innych stronach

nie ma takiej funkcji

jeżeli zderzają się dwie kule, to możesz łatwo znaleźć miejsce ich styku, bo znajduje się dokładnie na linii między ich środkami

jeśli szukasz miejsca przecięcia dwóch linii, to można wyprowadzić sobie miejsce przecięcia z układu równań

jeśli chcesz zrobić laser, to w moim uploaderze powinien być skrypt na to

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Co byś tutaj uznał za dokładny punkt kolizji?

 

yrdIvKi.png

 

jeśli masz na to jakąś wytyczną to pewnie da się obliczyć

Odnośnik do komentarza
Udostępnij na innych stronach

Jak to w końcu jest z przypisywaniem ID do danego obiektu i zapamiętaniem tego w grze? Mam powiedzmy 10 obiektów w grze na danej mapie, każdy musi być traktowany indywidualnie,np to są szafki do których wkładamy jakieś przedmioty- jak zapamiętać że np w trzeciej szafce włożyliśmy 2 jabłka i potem po powrocie do tej mapy nadal będą w tej samej szafce

Odnośnik do komentarza
Udostępnij na innych stronach

Jak to w końcu jest z przypisywaniem ID do danego obiektu i zapamiętaniem tego w grze? Mam powiedzmy 10 obiektów w grze na danej mapie, każdy musi być traktowany indywidualnie,np to są szafki do których wkładamy jakieś przedmioty- jak zapamiętać że np w trzeciej szafce włożyliśmy 2 jabłka i potem po powrocie do tej mapy nadal będą w tej samej szafce
Nie wiem czy rozróżniasz instance i obiekt. To spora różnica, więc staraj się doprecyzować przy następnym pytaniu.

Ogółem to każdy instance ma przecież własne zmienne. Jeżeli ten jeden instance pod jakimś warunkiem zmieni sobie jedna zmienną to pozostałe jej nie zmieni.

Odczytywanie danych to już zupełnie inne pytanie i najlepiej jest sobie opracować jakiś sposób przechowywania danych w plikach.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak to w końcu jest z przypisywaniem ID do danego obiektu i zapamiętaniem tego w grze? Mam powiedzmy 10 obiektów w grze na danej mapie, każdy musi być traktowany indywidualnie,np to są szafki do których wkładamy jakieś przedmioty- jak zapamiętać że np w trzeciej szafce włożyliśmy 2 jabłka i potem po powrocie do tej mapy nadal będą w tej samej szafce

 

Zapisujesz w jabłku id szafki w której jest.

Albo w szafce id jabłek które tam mają być.

Odnośnik do komentarza
Udostępnij na innych stronach

Tylko w jaki sposób to zrobić?Jakich funkcji użyć?

 

instance finde nearest do wykrycia najbliższej szafy przy której jabłko leży

to zwraca instance id

jestem_w_tej_szafie = instance_find_nearest.instance_id

 

Oczywiście warto sprawdzić czy to szafa, jak nie, to szuakasz następnego obiektu.

Zanim zrobisz coś bardziej złożonego to musisz wyjść z obiektów (przynajmniej takich typu jabłko, miecz) i korzystać ze struktur danych bo się zakopiesz.

Odnośnik do komentarza
Udostępnij na innych stronach

Tutaj masz przykład zoptymalizowany: Bloki to tylko obrazki - Background zapisany jako tileset. Prawdziwa kolizja jest z niewidzialnym w grze(ale widzialnym w edytorze) obiektem solidnym. Dobrą praktyką jest ten obiekt zrobić jak najmniej obstrukcyjny swoim wyglądem, abyś widział co jest pod spotem. Może być np. półprzeźroczysty. TUTAJ ILOŚĆ OBIEKTÓW WYNOSI ZALEDWIE 7. Dzięki możliwościom room editora, obiekt został rozciągnięty tak aby pokryć jak najwięcej solidnej przestrzeni.

46b1457b4a.png

Taka mała drobnostka, w sumie nie wpłynie praktycznie na optymalizację. Ale tak na prawdę w tych miejscach(zaznaczone na żółto) też nie musi być obiektu(nie musi być aż tak rozciągnięty):

6142c3342112.png

 

Swoją drogą, czy to na ile rozciągniemy obiekt wpływa na optymalizację? Np. czy 2x, a 30x?

 

@PS. Przyznawać się śmieszki, kto zgłosił posty Chella? xDD

Odnośnik do komentarza
Udostępnij na innych stronach

Taka mała drobnostka, w sumie nie wpłynie praktycznie na optymalizację. Ale tak na prawdę w tych miejscach(zaznaczone na żółto) też nie musi być obiektu(nie musi być aż tak rozciągnięty):

//obrazki

 

Swoją drogą, czy to na ile rozciągniemy obiekt wpływa na optymalizację? Np. czy 2x, a 30x?

 

@PS. Przyznawać się śmieszki, kto zgłosił posty Chella? xDD

 

Ja bym tych narrow corner nie usuwał, będzie jakiś platformer skakał po skosie, przetestuje przez 45deg przechodzący przez róg i wyfrunie z planszy.

To są niebezpieczne miejsca pod glicze, tam lepiej dać nakładające się obiekty dla pewności.

Odnośnik do komentarza
Udostępnij na innych stronach

@PoxiPol

Bo var działa tylko wewnątrz skryptu. Może dlatego. Nie do końca rozumiem jaki tu jest problem ;p

 

@3r3se7ven

No to już zależy od silnika gry. Plus tak naprawdę to nie musi być tak szeroki prostokąt. może pokrywać tylko krawędzie, nie całą pierwszą warstwę tych kwadratów niebieskich. To tak na prawdę zależy. Wiadomo, że vader chciał tylko pokazać ogólną zasadę.

Odnośnik do komentarza
Udostępnij na innych stronach

GML
globalvar KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT;

KEY_LEFT[0]=vk_left;

KEY_UP[0]=vk_up;

KEY_DOWN[0]=vk_down;

KEY_RIGHT[0]=vk_right;

GML
//Sprawdz czy jest w ruchy

if(keyboard_check(KEY_LEFT[argument0]) || keyboard_check(KEY_RIGHT[argument0]) || keyboard_check(KEY_UP[argument0]) || keyboard_check(KEY_DOWN[argument0]))

{

MOVING_INMOVE = true;

}else{

MOVING_INMOVE = false;

};

 

//Ustal kierunek poruszania

if(keyboard_check_pressed(KEY_LEFT[argument0]))

{

MOVING_DIRECTION = 180;

};

if(keyboard_check_pressed(KEY_RIGHT[argument0]))

{

MOVING_DIRECTION = 0;

};

if(keyboard_check_pressed(KEY_UP[argument0]))

{

MOVING_DIRECTION = 90;

};

if(keyboard_check_pressed((KEY_DOWN[argument0])))

{

MOVING_DIRECTION = 270;

};

 

//Wykonaj ruch

if (MOVING_INMOVE)

{

switch(MOVING_DIRECTION)

{

case 180: //lewo

x-=1*ASPD;

break;

 

case 0: //prawo

x+=1*ASPD;

break;

 

case 90: //gora

y-=1*ASPD;

break;

 

case 270: //dol

y+=1*ASPD;

break;

};

};

 

//Obroc sprite

image_angle=MOVING_DIRECTION;

To mój kod na poruszanie. Wszystko działało dopóki z vk_XXX nie zmieniłem na zmienną.

Pewnie jakoś źle wklepuje. Tylko pytanie jak to powinno być poprawnie?

Teraz w ogóle nie wyłapuje naciśnięcia, czyli coś zrąbałem z definiowaniem zmiennych, albo używaniem ich w keyboard_check_pressed

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
BtsQbnP.jpg

Fatal error, undefined value.

Ale w kodzie definiuje nawet 0!

nie rozumiem

utwórz ten sam obiekt od nowa (w sensie new object, i wklej to samo), wylacz i wlacz jeszcze raz gma

 

(gm: studio jest naprawde zabugowanym scierwem)

Odnośnik do komentarza
Udostępnij na innych stronach

@PoxiPol: GM:S powoli stara się zwracać uwagę na więcej błędów. Odczytując coś z struktury z miejsca gdzie nie ma tych danych odczytujesz wartość undefined. Możesz wtedy jedna z funkcji porówać tę wartosć. nie pamiętam coś typu is_undefined()

 

@upupup. No własnie najpierw przypisał 0, ale potem GM odczytuje undefined i przypisuje to undefined.

Odnośnik do komentarza
Udostępnij na innych stronach

GMLglobalvar KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT;

KEY_LEFT[0]=vk_left;

KEY_UP[0]=vk_up;

KEY_DOWN[0]=vk_down;

KEY_RIGHT[0]=vk_right;

GML//Sprawdz czy jest w ruchy

if(keyboard_check(KEY_LEFT[argument0]) || keyboard_check(KEY_RIGHT[argument0]) || keyboard_check(KEY_UP[argument0]) || keyboard_check(KEY_DOWN[argument0]))

{

MOVING_INMOVE = true;

}else{

MOVING_INMOVE = false;

};

 

//Ustal kierunek poruszania

if(keyboard_check_pressed(KEY_LEFT[argument0]))

{

MOVING_DIRECTION = 180;

};

if(keyboard_check_pressed(KEY_RIGHT[argument0]))

{

MOVING_DIRECTION = 0;

};

if(keyboard_check_pressed(KEY_UP[argument0]))

{

MOVING_DIRECTION = 90;

};

if(keyboard_check_pressed((KEY_DOWN[argument0])))

{

MOVING_DIRECTION = 270;

};

 

//Wykonaj ruch

if (MOVING_INMOVE)

{

switch(MOVING_DIRECTION)

{

case 180: //lewo

x-=1*ASPD;

break;

 

case 0: //prawo

x+=1*ASPD;

break;

 

case 90: //gora

y-=1*ASPD;

break;

 

case 270: //dol

y+=1*ASPD;

break;

};

};

 

//Obroc sprite

image_angle=MOVING_DIRECTION;

To mój kod na poruszanie. Wszystko działało dopóki z vk_XXX nie zmieniłem na zmienną.

Pewnie jakoś źle wklepuje. Tylko pytanie jak to powinno być poprawnie?

Teraz w ogóle nie wyłapuje naciśnięcia, czyli coś zrąbałem z definiowaniem zmiennych, albo używaniem ich w keyboard_check_pressed

 

 

Bo to funkcja i/o device get array[key] pobierająca z systemu operacyjnego (chyba z jakiegoś modułu direct input dla i/o). Jak chcesz ją oszukać to tam jest takie polecenie keyboard_key, i wtedy udaje że to z klawiatury zmienna idzie.

 

A jak chcesz tak jak robisz, to musisz przypisać wartości klawiszy do zmiennych (albo tablicy), i wtedy korzystać z tej tablicy.

Czyli musisz sobie całą funkcjonalność zbudować do tego.

 

 

A w ogóle to zamiast and-or'ów polecam xor'y do takich rzeczy :)

Odnośnik do komentarza
Udostępnij na innych stronach

A jak chcesz tak jak robisz, to musisz przypisać wartości klawiszy do zmiennych (albo tablicy), i wtedy korzystać z tej tablicy.

Czyli musisz sobie całą funkcjonalność zbudować do tego.

Tzn.? Przypisuje do tablicy np.: KEY_LEFT[0]=vk_left; i później sprawdzam if(keyboard_check_pressed(KEY_LEFT[0])). Więc o co dokładniej chodzi?

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   1 użytkownik

×
×
  • Dodaj nową pozycję...