Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   9 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
Chell

Temat zbiorczy na drobnostki

Pytanie

Chell    26

masz pytanie, które nie zasługuje na własny temat i chcesz je zadać w shoutboxie? nie rób tego! tam utonie! spytaj tutaj. :-)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

741 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
Ignatus    4

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?

Udostępnij tego posta


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

Chodzi Ci o optymalizację, żeby łatwiej było uciągnać te 60 FPS czy o delta timing, żeby mimo ilości mniejszej klatek nie było to tak odczuwalne(tempo gry wtedy jest niezmienne, tylko ilość fpsów się zmienia)?

Udostępnij tego posta


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

Chodzi o wymuszenie stałej ilości FPS niezależnie od urządzenia, ktoś o tym kiedyś napisał na FPS - chyba Threef ale głowy nie dam.Choś z tego co piszesz to oczywiście chodzi mi o finalny efekt -bez znaczenia co cyferki pokazują czyli delta timing

Udostępnij tego posta


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

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?

Udostępnij tego posta


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

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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
I am vader    17

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

Udostępnij tego posta


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

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
I am vader    17

Poza tym kolizja to nie punkt x box, tylko box x box. Kolizja jest wyliczana matematycznie, a nie sprawdzajac piksel po pikselu, wiec kolizja tylko sprawdza czy sie dwa uklady nakladaja.

Udostępnij tego posta


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

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

 

yrdIvKi.png

 

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

Udostępnij tego posta


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

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Threef    4
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
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ć.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
MaxGaming    0
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
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.

Udostępnij tego posta


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

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
@PoxiPol

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

 

 

Wypadałoby podać mu jakieś wartości na wypadek jakby sobie w ds nie znalazł?

Udostępnij tego posta


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

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
ANtY    9
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)

Udostępnij tego posta


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

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
I am vader    17

[źle zrozumiałem, do wywalenia]

Edit: Nie do wywalenia

 

jeżeli wpis "worldX" i "worldY" nie istnieją to da Ci UNDEFINED.

Pamiętaj: CASE SENSITIVE, może to "WorldX" zamiast "worldX"

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
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 :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
MaxGaming    0
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?

Udostępnij tego posta


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

Nie. Działało jak używałem if(keyboard_check_pressed(vk_left)). Tylko vk_left o ile się nie mylę przechowuje tylko id przycisku(int). Dlaczego więc nie działa po mojemu?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
3r3se7ven    0
Nie. Działało jak używałem if(keyboard_check_pressed(vk_left)). Tylko vk_left o ile się nie mylę przechowuje tylko id przycisku(int). Dlaczego więc nie działa po mojemu?

 

 

Owszem przechowuje tylko, że w device keyboard w systemie operacyjnym i tylko stamtąd pobiera tę zmienną jako rezultat odczytu i/o device.

Właśnie dlatego ma funkcję co się nazywa oddzielnie, inaczej byś mógł po prostu zadać variable_N = vk_left i też by grało :)

 

Właśnie dlatego jest keyboard_key_press(key);

 

Podejrzewam, że chciałeś przypisać własną tablice konfigurowania znaków.

 

To niestety musisz stworzyć tablicę wczytującą z klawiatury do Twojej array[key], a później z tej macierzy pobierać rezultat.

Właściwie to tak działają przyciski joysticków, pady, więc tam znajdziesz rozwiązania lepsiejsze i gorsiejsze.

 

Na szczęście klawiatura podaje znaki właśnie jako int, więc w ds_list możesz sobie wrzucić w pola wartość jest/nie ma, i przypisać rezultaty do innej ds_list z której czytasz wejście dla fizyki gry.

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

×