2011-02-02 9 views
9

Oparłem swoją grę na przykładzie księżycowego księżyca i miałem problemy z jąkaniem odkąd zacząłem ją tworzyć. Nic, co wypróbowałem, nie pozbyło się ich, więc dotarłem do punktu, w którym spędziłem kilka godzin, tworząc obnażoną wersję przykładu z księżycowego księżyca i wprowadzając prosty obraz przewijania, aby pokazać jąkanie. UWAGA: nie ma związku z śmieciarzem. Jeśli uważasz, że tak jest, po prostu spójrz na dziennik, śmieciarz działa tak samo blisko, jak pojawia się jąkanie.Problemy z dziwnym jąkaniem, których nie mogę się pozbyć (pełne źródło w zestawie)

Obraz przewinięty w dół ekranu zacina się w przybliżeniu co sekundę przez około 1/10 sekundy w telefonie (Motorola Milestone, 2.2). Ten rodzaj jąkania nie całkowicie niszczy rozgrywkę, ale jest bardzo rozpraszający i frustrujący. Moja gra wymaga również szybkiego przewijania i szybkich ruchów, więc jest to bardziej oczywiste.

Jeśli ktoś z was ma czas można wziąć szybki rzut oka na tego projektu Eclipse i sprawdzić, czy:

  1. To jąka dla Ciebie w telefonie (patrz uważnie, gdyż przewija, że ​​ma mały szkopuł co pół sekundy do sekundy i pół)
  2. Jeśli widzisz jakiś sposób naprawić jąkanie

mam nadzieję, że ja po prostu mieć opóźniony wiersza kodu, który jest przyczyną tej całej sprawy bez mojej realizacji. Po prostu nie mogę uwierzyć, że nawet po tym, jak się rozbierałem, wciąż ma dokładnie tyle samo jąkania, co moja pełna gra z 1000 obiektów, zwłaszcza, że ​​działa na stałym 60 fps w moim telefonie.

EDYCJA: Zaprofilowałem moją grę na Traceview, wydaje się, że dobrze.

Źródło Link do pobrania: http://dl.dropbox.com/u/4972001/LunarLander.rar

+2

Próbowałaś profilowania grę z traceview? http://developer.android.com/guide/developing/tools/traceview.html – bigstones

+1

Tak, mam, wydawało się dobrze - były nawet luki między każdym wywołaniem "updatePhysics" i nie widziałem żadnych nietypowych luk bez połączeń. – Smills

+1

Nie jestem pewien, czy to ja, ale myślę, że jest * ledwo * zauważalne jąkanie (wypróbowane na LG Optimus One 2.2) – bigstones

Odpowiedz

0

Brzmi jak Twój przewijanie generuje mnóstwo śmieci, które muszą być zbierane często. Jeśli tworzysz wiele krótkoterminowych małych obiektów, rozważ zarządzanie własną pulą. Dopóki nie pozwolisz, by basen wzrósł bez ograniczeń, może to znacznie ograniczyć gc, który opóźnia twój czas.

+1

Część "UWAGA: jest nie są powiązane z śmieciarzem, a jeśli uważasz, że tak jest, spójrz na dziennik, śmieciarz działa tak samo blisko miejsca, w którym pojawia się jąkanie. był tam na początku :) Dobra sugestia jednak, faktycznie przyjąłem ten sam problem w pierwotnym pytaniu i zasugerowałem to samo rozwiązanie. http://stackoverflow.com/questions/4867732/traceview-shows-some-methods-arent-being-called-for-200ms-or-more/ –

+1

Tak, niestety to nie wydaje się być śmieciarzem, I Chciałbym, żeby było tak, jak byłoby to łatwe i łatwe do naprawienia. Jeśli spojrzysz na przykład, wyeliminowałem wszystkie połączenia (lub przynajmniej prawie wszystkie połączenia), które generują śmieci w czasie wykonywania. – Smills

1

Próbowałem go na moim telefonie (nexus jeden), to było dla mnie takie samo.

Zrobiłem kilka zmian, które sprawiły, że lepiej dla mnie:

  1. Zamiast deklarowania nowych zmiennych za każdym razem podczas pętli, i ogłosił jako właściwości klasy

    Płótno c ​​= null; // staje się

    prywatne płótno c;

    // w pętli teraz wystarczy użyć

    c = null

Zrób to dla wszystkich zmiennych deklarowania kółko w funkcji doDraw i updatePhysics.

  1. zamiast zwiększania viewY aż na wieki, po prostu umieścić trochę jeśli statemant

    if (viewY> mCanvasHeight) {

    viewY -= mCanvasHeight; 
    

    }

jestem nie jestem pewien, czy działa teraz w 100%, ale wydaje mi się znacznie lepszy.

+0

Ach, dałem sobie spokój i wydaje mi się, że jest trochę płynniejszy, ale niestety wciąż zacina się na moim telefonie. Udało mi się wypróbować to na Desire HD przyjaciela i było płynne na jego telefonie. Wygląda na to, że wpływa tylko na niektóre urządzenia, co jest nieco dziwne. – Smills

+0

Jaka jest wiarygodność, na jaką ta zmiana ma wpływ?Sceptycznie podchodzę do tego, że zmiana kodu robi jakąkolwiek prawdziwą różnicę i myślę, że to po prostu placebo, które uważasz teraz za gładsze. @Smills: The Desire HD jest o wiele potężniejszy niż Kamień milowy. Milestone wydaje się dużo wolniejszy w grach niż w przypadku większości nowszych telefonów. Zauważyłem, że niektóre z aplikacji jąkających się Milestone są płynne na nowszych telefonach. – rbcc

0

Testowałem to na Verizon DroidX (2.2.1) i wygląda to co 3-6 sekund i bardzo krótko. Wygląda trochę lepiej, gdy aktywna tapeta jest wyłączona i nic więcej nie działa. Może podsystem graficzny po prostu nie nadąża? Czy próbowałeś mniej intensywnego obrazu graficznego (mniej pikseli i mniejszej liczby kolorów), żeby zobaczyć, co robi?

0

Rysujesz trzy ogromne mapy bitowe na klatkę ... to więcej pracy niż potrzebujesz. Lepszym rozwiązaniem może być użycie zestawu BitmapShader z zestawem TileMode do powtórzenia. To tylko jedno połączenie z warstwą natywną.

Dodawanie członka Paint paint; gdzieś i zmienić setSurfaceSize() zawierać następujące linie:

BitmapShader shader = new BitmapShader(mBackgroundImage, 
    TileMode.CLAMP, TileMode.REPEAT); 
paint = new Paint(); 
paint.setShader(shader); 

Następnie doDraw() tylko musi być to:

//translate to viewY position 
canvas.translate(0,(float)(-viewY)); 

//draw backgrounds 
canvas.drawPaint(paint); 

nie zostały faktycznie mierzy to udowodnić, jest szybszy, ale z tego co wiem na temat interfejsów graficznych API to z pewnością powinno być.

(Oczywiście jeśli naprawdę chcą latać należy być przy użyciu OpenGL ES ...)

Powiązane problemy