• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Libgdx zamknięcie aplikacji bez komunikatu

Object Storage Arubacloud
+1 głos
384 wizyt
pytanie zadane 20 sierpnia 2017 w Java przez SebekMakaron Obywatel (1,290 p.)
Witam piszę grę w libgdx. Gra działa prawidłowo na komputerze i emulatorze lecz na fizycznym urządzeniu nie oczekiwanie wyłącza się problem w tym że wyłącza się nie zawsze w tym samym momencie tylko po upływie jakiegoś czasu i gdy zmienię ekran(wywołam metodę dispose()) chyba tu jest problem. Grę piszę od czerwca więc nie jestem wstanie podać żadnego kodu jest on za duży a ja nawet nwm gdzie tak naprawdę jest problem. Chodzi mi tylko o to czy wiecie co może być przyczyną wyłączenia się gry bez pokazania jakiegokolwiek komunikatu, to tak jakbyście ją sami wyłączyli z tym że dzieje się tak tylko na fizycznym urządzeniu jedyną podpowiedzią może być pamieć ram. Z góry dziękuję za poświęcony czas.

1 odpowiedź

+1 głos
odpowiedź 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
wybrane 21 sierpnia 2017 przez SebekMakaron
 
Najlepsza
Może masz kod na jakimś githubie?

Tak ciężko mi cokolwiek powiedzieć, może wywołujesz dispose zanim zmienisz ekran?
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
Odkryłem jeszcze że dopiero po upływie jakiegoś czasu się wyłącza. Mam wrażenie że to tak jakby urządzenie cały czas gromadziło i gromadziło pamięć a gdy jest pełna wyłącza się.

Nwm czy to pomoże ale to może mieć związek z tym:

Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: buffer not allocated with newUnsafeByteBuffer or already disposed
komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
Pokaż mi kod metody dispose ekranu z którego wychodzisz przy zmianie
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
edycja 20 sierpnia 2017 przez SebekMakaron

public void dispose(){
        stageUi.dispose();
        stageStats.dispose();
        stageCard.dispose();
        hero3D.dispose();
        card.dispose();
        asset.dispose();
        stage.dispose();
        asset.manager.dispose();
        game.dispose();
    }

 

Próbowałem zmieniać tona różne sposoby

A czy istnieje możliwość usuwania zbędnej pamięci w każdym wywołaniu głównej pętli gry?

komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)

Po tym wyjątku co wysłałeś wiadomo że coś już miało wywołane dispose a jest jeszcze potem użyte. Rób wszystko metodą "First in - last out" czyli to co tworzysz pierwsze, ostatnie usuwasz. np:

game = new Game();
stage = new Stage();
actor = new Actor();

actor.dispose();
stage.dispose();
game.dispose();

Możesz jeszcze pokazać metodę która jest odpowiedzialna za zmianę ekranu

komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
W libgdx musisz bardziej sam pilnować zarządzania pamięcią, np nie tworzyć nowych instancji tekstury w głównej pętli. Ale tutaj crash nie jest spowodowany pamięcią RAM.
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
for (int i = 0; i < BaseMap.getEntriaceToMapRectangle().size(); i++) {
            if (calculateCollisionTwoRectangle(heroBox, BaseMap.getEntriaceToMapRectangle().get(i))) {
                Hero3D.setStopAnimation();
                soundNextMap.play(0.8f);
                setStopStep();
                preferences.putInteger("COLLISION", 0).flush();
                /**
                 * i = indexToLoadMap
                 */
                switch (BaseMap.getIndexToLoadNextMap().get(i)) {
                    case 0:
                        System.out.println("map1");
                        game.setScreen(new Map_01(game));
                        break;
                    case 1:
                        System.out.println("map2");
                        game.setScreen(new Map_02(game));
                        break;
                    case 2:
                        System.out.println("map3");
                        game.setScreen(new Map_03(game));
                        break;
                    case 3:
                        System.out.println("map4");
                        game.setScreen(new Map_04(game));
                        break;
                    case 4:
                        System.out.println("map5");
                        game.setScreen(new Map_05(game));
                        break;
                    case 5:
                        System.out.println("map6");
                        game.setScreen(new Map_06(game));
                        break;
                    default:
                        break;
                }
            }
        }

Problem nie pojawia się w tym samym momencie, upływa określony czas i gdy po tym czasie wejdę wejdę w nową mapę wtedy zamyka grę. Wyjątkiem jest tylko pierwsza mapa która ładuję się automatycznie po starcie gry i na niej mogę stać ile chcę i nic się niedzieje, przypomnę że dzieje się to tylko na urządzeniu fizycznym

komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
Poszukaj czegoś co jest używane a miało wywołany dispose i skoro pierwsza mapa działa dobrze to porównaj jakich operacji nie wykonałeś przy zmianie mapy a jakie wykonałeś przy ładowaniu pierwszej
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
Każda mapa jest identyczna bo dopiero je prowadzam różnią się tylko grafiką. A czy jest coś co potrafisz wskazać coś co różni komputer od androida związane z tym problemem?
komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
Nic związanego z tym problemem nie przychodzi mi na myśl
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
Właśnie usunąłem wszystkie dispose z gry dla testu i gra nadal działa na komputerze a na androidzie znów to samo
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
Jak zapisać błąd do pliku txt na androidzie aby można go było odczytać przez komputer
komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
Najłatwiej - uruchomić grę na telefonie przez adb i w android monitorze będziesz miał. Z jakiego IDE korzystasz?
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
Mam problem ze sterownikami próbowałem go już dawno rozwiązać ale nic z tego. Korzystam z android studio. Gdybym mógł skorzystać z tej opcji było by o niebo lepiej. Laptop coś źle instaluje sterowniki spróbuje. Przegrać android studio na pendrive i na innym laptopie to sprawdzić Odezwe się co z tego wyszło
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
Udało mi się zainstalować sterowniki uruchomiłem gre na telefonie z poziomu android studio i niestety brak jakiegokolwiek komunikatu po zamknięciu gry. Poprostu ręce mi opadają.

Napisałem kod na pokaznie FPS i zauważyłem że w chwili startu gry FPS wynosi 22-23 i zaczyna powoli spadac przed samym końcem zamknięcia gry wynosi 11-13. Hipoteza z wyciekiem pamięci jest błędna tuż przed zamknięciem programu pokazuje:

Explicit concurrent mark sweep GC freed 34681(638KB) AllocSpace objects, 3(46KB) LOS objects, 40% free, 14MB/24MB, paused 868us total 206.454ms

40% free.

Na komputerze FPS wynosza 60 z niewielkim wachaniem i sa stałe nie spadają z biegiem czasu jak w przypadku uruchomienia na telefonie.

Nwm czy to coś pomoże ale ostatnim komunikatem wyświetlonym na czerwono jest to:

'2c5a702b com.mygdx.game/com.mygdx.game.AndroidLauncher (server)' ~ Channel is unrecoverably broken and will be disposed!
komentarz 20 sierpnia 2017 przez SebekMakaron Obywatel (1,290 p.)
IT'S WORK!!! Tak jak przypuszczałem wyciek pamięci otóż w głównej pętli gry miałem metodę która renderowała mi linie(debug line do sprawdzenia kolizji) i ona była w porządku lecz w środku niej była dodana inna metoda w której właśnie ciągle tworzyły się nowe instancje klas (new Klas()). Czytałem o tym że problemem najprawdopodobniej jest tworzenie nowych obiektów w pętli głównej lecz zignorowałem to ponieważ sądziłem że znam na wylot tą metodę która powodowała błąd lecz wewnątrz niej była niespodzianka. Spostrzegłem to dzięki temu że napisałem metodę pokazująca FPS które spadały. Na dodatek rozwiązałem dwa dodatkowe problemy, naprawiłem dawno już porzucony problem z debugowaniem USB na który poświęciłem kiedyś bardzo dużo czasu a dziś raz dwa i zrobione i FPS z 22-23 podniosły się na 42-46 muszę to jeszcze spróbować zoptymalizować. I wyjaśniło się dlaczego FPS na komputerze był stale 60, ponieważ mam 8GB ram więc trochę się zejdzie aż to nadpisze. Dziękuje Ci bardzo Serdecznie za poświęcony mi czas. :D
komentarz 20 sierpnia 2017 przez KubenQPL Maniak (62,820 p.)
No spoko :P

Podobne pytania

0 głosów
0 odpowiedzi 229 wizyt
pytanie zadane 24 stycznia 2018 w Java przez Szaradek Obywatel (1,340 p.)
0 głosów
1 odpowiedź 188 wizyt
0 głosów
0 odpowiedzi 114 wizyt
pytanie zadane 21 sierpnia 2017 w Java przez SebekMakaron Obywatel (1,290 p.)

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...