2011-02-04 8 views
7

Pracowałem nad grą na Androida przez ostatnie 6 miesięcy i pisałem tutaj kilka razy o różnych problemach z lagami, których nie mogę się pozbyć.Czy nie jest możliwe, aby gra na Androida była bezproblemowa? Szaleję tutaj

Skończyło się na tym, że przyjąłem przykład LunarLandera i rozebrałem go na jego podstawowe komponenty, aby sprawdzić, czy mogę zrobić wszystko, co nie zwleka. Wszystko, co naprawdę robi, to zmiana wielkości płótna tłumaczonego na każdą klatkę, a następnie narysowanie tła na płótnie. NAWET WIĘCEJ, o tak prostym, jak to tylko możliwe, aby uzyskać aplikację surfaceView - zacina się ...

Moja gra to przewijana gra, w której ciągle przesuwa się ekran (myślę o grze latającej), ale sposób, w jaki obecnie jestem robienie tła powoduje ciągłe jąkanie co sekundę około 50-100ms. Nie jest to łamanie gry, ale jest bardzo rozpraszające i sprawia, że ​​gra wydaje się być zaprogramowana przez kompletnego kretyna (choć zaczynam podejrzewać, że tak może być).

Nie, to nie jest garbage collector, nie ma żadnych nowych obiektów tworzonych w ogóle podczas pętli uruchamiania gry, a GC prawie nigdy nie działa podczas mojej gry.

Praktycznie wydzieję sobie włosy z frustracji. Spędziłem ponad 40 godzin, próbując pozbyć się lagów na tym prostym przykładzie zastosowania w ciągu ostatniego tygodnia i to doprowadza mnie do szału. W jaki sposób aplikacja tak prosta jak ta, którą złączyłem, może mieć problemy z opóźnieniem? Nie pomyślałbyś, że przewijanie tła może być znacznie prostsze niż to ...

UWAGA: Ta demonstracja nieustannie pobiera około 60 fps w moim telefonie (Milestone Motoroli). Odkomentuj kod FPS w przykładzie, aby zobaczyć FPS.

TL; DR: Niezwykle prosty program, który jest po prostu przewijanym tłem, pokazuje jąkanie. Proszę spojrzeć ...

Link do pobrania prosty przykład jąkania opiera się na przykładzie LunarLander: http://dl.dropbox.com/u/4972001/LunarLander.rar

+0

Czy demo JetBoy mieć jąkanie, gdy pracuje on na Twój telefon? http://developer.android.com/resources/samples/JetBoy/index.html – jhouse

+0

Co powiedział Ci Traceview? Również w przyszłości pomiń nagłówki przynęt. – CommonsWare

+0

Przepraszam za przynętę na ognie, byłem bardzo sfrustrowany, kiedy to napisałem (jak jestem pewien, że możesz powiedzieć). Traveview nie pokazuje niczego niezwykłego. Istnieją równe przerwy między wszystkimi wywołaniami draw/updatePhysics. Wydaje się, że jest to coś, co jest widoczne, ale nie dające się zmierzyć, co jest mylące. Ponadto, tak, JetBoy również ma problemy z jąkaniem. – Smills

Odpowiedz

4

Pobrałem plik RAR z przewijaniem tle (wygląda trawiastym polu) i zainstalowany na moim Motorolla Droid.

Nie widzę żadnego jąkania podczas przewijania, oglądałem ją przez ponad minutę.

Na podstawie Twojego opisu postawiłbym, że sprzęt/platforma Milestone ma dziwny problem z rysowaniem i synchronizacją wideo.

Być może wyjaśnienie jest czymś podobnym do tego: Rozgrywka Milestone odświeża się na 60 Hz (po prostu wybierając numer tutaj, nie wiem, co to naprawdę jest), a twoja liczba klatek jest nieco mniejsza od tego - powiedzmy 63 lub 57 Hz ... czy nie można sobie wyobrazić, że w przybliżeniu raz na sekundę czas trwania losowania i czas wyświetlania aktualizacji sprzętu są na tyle duże, że tło nie zostanie ponownie pobrane, i musi poczekać do następnej klatki? I czasami linie czasu są tak duże, że możesz przegapić czas dwóch lub trzech losowań z rzędu (w zależności od tego, jak daleko od cyklu klatek jest od rzeczywistego cyklu odświeżania ekranu).

EDYCJA: Właściwie to obserwowałem to przez kolejną minutę, widziałem jedno bardzo krótkie (tylko dostrzegalne) jąkanie.

+0

To była jedna z moich teorii (częstotliwość odświeżania jest trochę poza FPS), ale nie mam pojęcia, jak to naprawić ... Czy uważasz, że istnieje jakiś prosty sposób na naprawienie tego rodzaju problemu? – Smills

+0

Nie jestem tego świadomy. W moim doświadczeniu z kodowaniem gier na innych platformach w ciągu kilku dni (na przykład playstation 1, sega saturn, itp.) Częstość klatek była zsynchronizowana z szybkością wyświetlania przez faktyczne uzyskanie haka sprzężenia sprzętowego ze sterownikiem wyświetlacza. Nie masz pojęcia, jak możesz to zrobić na platformie Android. – jhouse

+0

Hmm, cóż, widziałem jąkanie zarówno w kopalni, jak i telefonie znajomego (Nokia N900 z systemem Android 2.2). Zastanawiam się, czy to tylko efekt małej grupy telefonów. – Smills

0

Czy zastanawiałeś się nad sugestią jhaula minimalnego czasu wyświetlania klatek?

Używam tego pomysłu w moim bieżącym projekcie.Spodziewam się, że sprzęt telefoniczny znacznie poprawi się w przyszłym roku lub dwóch, więc to uniemożliwi grę w przyszłości.

Mój kod to tak:

long frameTime; // calculate time to process this frame 

    while (mSurfaceAvailable) { 
     // ensure minimum frame time can be calculated 
     frameTime = SystemClock.uptimeMillis(); 

     // code to move everything and display a single frame goes here 

     // ensure minimum frame time 
     frameTime = SystemClock.uptimeMillis() - frameTime; 
     if (frameTime < 0) frameTime = MIN_FRAME_TIME;  // cope with wrap-around of uptimeMillis 
     if (frameTime < MIN_FRAME_TIME) { 
      /*DEBUG*/Log.v(this.getClass().getName(), "run: Sleeping for "+(MIN_FRAME_TIME - frameTime)+"ms"); 
      try { 
       sleep(MIN_FRAME_TIME - frameTime); 
      } catch (InterruptedException e) { 
       /*DEBUG*/Log.i(this.getClass().getName(), "run: Thread sleep was interrupted (not a problem)"); 
      } 
     } else { 
      if (frameTime != MIN_FRAME_TIME) { 
       /*DEBUG*/Log.v(this.getClass().getName(), "run: System is too slow, by "+(frameTime - MIN_FRAME_TIME)+"ms per frame"); 
      } 
     } 

mam wyjątek uśpienia magazynowe z forum (chyba ten jeden!), Ale nigdy nie widziałem wyjątek rzucony

+0

To jest interesujące. Zaimplementowałem twój powyższy kod, jeśli ustawię moją grę na 20 ms MIN_FRAME_TIME, ma ona znacznie więcej opóźnienia niż gdybym ustawił ją na MINMSF_STUDZENIA 33ms. Spodziewałbyś się czegoś przeciwnego ... EDYCJA: Ponownie jest płynniejszy dzięki 16 ms MIN_FRAME_TIME.EDIT2: Jednak nadal się zacina. Choć prawdopodobnie mniej niż wcześniej. – Smills

+0

Co masz na myśli przez lag? Im większy MIN_FRAME_TIME tym wolniejsza gra. Nie wiem, jak rejestracja wpłynie na rzeczy, więc spróbuj wymienić wszystkie/* DEBUG */z // DEBUG * / – FrinkTheBrave

1

miewam ten sam problem z lagami w mojej grze (i zrobiłem coś podobnego do pętli LunarLandera i doszedłem do podobnego wniosku). Jeśli otworzysz logcat, zobaczysz, że opóźnienia występują razem z GC_FOR_MALLOC (50 ... 100 ms, nasz czas opóźnienia). Podejrzewałem, że źródłem problemu był garbage collector. Potem znalazłem ten wpis:

http://fanitis.com/2011/02/09/android-game-performance-garbage-collection/

postaram się zmniejszyć zużycie śmieciarza i zobaczyć, czy mogę osiągnąć lagless warunek hehehe =]

Powiązane problemy