Filar Społeczności Chell Opublikowano 23 Września 2015 Filar Społeczności Udostępnij Opublikowano 23 Września 2015 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. :-) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ignatus Opublikowano 23 Września 2015 Udostępnij Opublikowano 23 Września 2015 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 Więcej opcji udostępniania...
MaxGaming Opublikowano 23 Września 2015 Udostępnij Opublikowano 23 Września 2015 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)? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ignatus Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
Ignatus Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
I am vader Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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. 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PoxiPol Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 Istnieje jakaś funkcja która zwraca dokladne x i y kolizji? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Amaterasu Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
I am vader Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności ANtY Opublikowano 24 Września 2015 Filar Społeczności Udostępnij Opublikowano 24 Września 2015 Co byś tutaj uznał za dokładny punkt kolizji? jeśli masz na to jakąś wytyczną to pewnie da się obliczyć Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ignatus Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 szafceNie 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
Ignatus Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 Tylko w jaki sposób to zrobić?Jakich funkcji użyć? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
MaxGaming Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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. 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): 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
PoxiPol Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 Fatal error, undefined value. Ale w kodzie definiuje nawet 0! nie rozumiem Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
MaxGaming Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 @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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 @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ł? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
MaxGaming Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
Filar Społeczności ANtY Opublikowano 24 Września 2015 Filar Społeczności Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 @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 Więcej opcji udostępniania...
I am vader Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 [ź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" Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
MaxGaming Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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? A działało? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
MaxGaming Opublikowano 24 Września 2015 Udostępnij Opublikowano 24 Września 2015 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? 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ę