Skocz do zawartości
cwany

rysowanie do canvas - wydajność i lekkie zrywy

    Rekomendowane odpowiedzi

    cwany

    Witam,

    Rysuję do canvas w osobym wątku, podobnie zresztą jak to jest w przykładzie LunarLandera. Animacja jest bardzo płynna (60 fps) ale co jakiś czas 1-2 sek. pojawia się ledwo zawuażalny "zryw" trwający bardzo krótko. To samo zresztą można zaobserwować w LunarLanderze ale widać to wyraźniej przy wielu jednocześnie poruszających się "spritach".

    Początkowo myślałem że to wina GarbageCollectora, ale po przerobieniu kodu na niealokujący niczego w głównej pętli gry i potwierdzeniu tego Allocation Trackerem z DDMS widać że to nie jest sprawka GC.

    Niby można przesiąść się na openGL, ale dla prostych gier 2D wszędzie piszą że canvas wystarczy. Bawie się zresztą na i5700 na niemodowanym 2.1. Wiadomo że można podkręcić system różnymi modami ale moim zdaniem prosta gierka 2D powinna chodzić dobrze wszędzie, więc o co chodzi ?

    Pozdrawiam,

    cwany

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Zrywy występują w zupełnie przypadkowych sytuacjach? czy zachodzi jakaś zależność (nie koniecznie widoczna na pierwszy rzut oka)

    Możesz coś więcej opisać co dokładnie dzieje się na ekranie w trakcie gry? lub może screen? (zawsze może nasunąć pomysł co jest nie tak).

    Póki co, zero koncepcji.

    Możesz spróbować mierzyć też czasy w różnych momentach programu. Może pomoże to w wyłapaniu locka (przynajmniej gdzie on się znajduje)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    piotrpo

    GC to główny podejrzany, ale jeśli go wykluczyłeś, to właściwie ciężko coś będzie namierzyć. Równie dobrze może to być jakiś serwis chodzący w tle, a nie powiązany kompletnie z twoją aplikacją.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Myślę, że serwis chodzący w tle można szybko wyeliminować. Wyłączyć zbędne serwisy i/lub przetestować na innej aplikacji, czy freezy się pojawiają.

    Ciągle próbowałbym z pomiarami czasów i wyłapywaniem, gdzie pojawiają się "dziwnie" długie.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    no tak zbadałeś wszystko co dotyczy Javy usługi, GC itd.. ale nie wziąłeś pod uwagę serwera usług innych ważnych procesów Java oraz samego systemu i procesów systemowych które w tle coś na bieżąco robią, uruchom program na emulatorze tam będzie lepiej widać i włącz podgląd czasu procesora sprawdź pod kontem anomalii w proporcjach zielonego do czerwonego

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    piotrpo

    Tak z ciekawości, czy jest jakiś profiler do androida i ja go nie namierzyłem, czy też nie ma takiego narzędzia?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Cwany <- prawdopodobnie nie tu leży problem, ale obsługa zdarzeń wejścia potrafi poważnie zmulić aplikację. Dodanie spania w obsłudze zdarzeń wątku UI rozwiązuje problem. Jeżeli chodzi o samoczynne przyciachy kiedy użytkownik aplikacji nic nie robi - też spotkałem się z czymś podobnym (aczkolwiek występującym o wiele rzadziej, niż opisujesz), jednak nie badałem sprawy zakładając, że jest to wina GC i tym samym problem do rozwiązania później.

    Być może wynika to w jakiś sposób z użycia Canvas - gry, które ściągałem z Marketu wydają się nie mieć tego problemu, a te popularne w większości przypuszczalnie korzystają z OGL'a. Nie korzystałem z Allocation Trackera - nie wiem więc, czy to możliwe, ale być może Canvas podczas użycia dokonuje alokacji na poziomie systemu i tego w AT nie widać?

    Piotrpo <- traceview. Od najnowszej wersji SDK jest (a przynajmnie powinien być - nie sprawdzałem :P) zintegrowany z Eclipsem.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    cwany

    Wow, nie spodziewałem się takiego odzewu.

    Zrywy występują w zupełnie przypadkowych sytuacjach?

    Tak, zrywy są w przypadkowych momentach co pare sekund. Jak wrócę z pracy to wrzucę screena gdzie - po wyłączeniu czyszczenia tła przed rysowaniem każdej klatki - widać "smugę" pozostawianą przez poruszający się sprite i widać też zrywy na tej "smudze".

    Swoją drogą aplikacja nic nie robi tylko odswieża pozycję kilku obiektów na ekranie i je rysuje w pętli - nic skomplikowanego.

    GC to główny podejrzany, ale jeśli go wykluczyłeś, to właściwie ciężko coś będzie namierzyć. Równie dobrze może to być jakiś serwis chodzący w tle, a nie powiązany kompletnie z twoją aplikacją.

    Telefon ma czysty system, w tle na 99% nic nie chodzi (swoją drogą jak to sprawdzić ? - telefon mam od 3 dni)

    Myślę, że serwis chodzący w tle można szybko wyeliminować. Wyłączyć zbędne serwisy i/lub przetestować na innej aplikacji, czy freezy się pojawiają.

    Sprawdzenie telefonu na innej grze to jest jakaś myśl. Niech ktoś rzuci nazwę jakiejś aplikacji do ściągnięcia która nie korzysta z openGLa.

    no tak zbadałeś wszystko co dotyczy Javy usługi, GC itd.. ale nie wziąłeś pod uwagę serwera usług innych ważnych procesów Java oraz samego systemu i procesów systemowych które w tle coś na bieżąco robią, uruchom program na emulatorze tam będzie lepiej widać i włącz podgląd czasu procesora sprawdź pod kontem anomalii w proporcjach zielonego do czerwonego

    Emulator nawet na szybkim pececie jest zbyt wolny żeby było cokolwiek widać, jak mówiłem zrywy są lekkie i ogólnie bardzo ich nie widać, ale jak ktoś się wpatruje to robią się denerwujące.

    Cwany <- prawdopodobnie nie tu leży problem, ale obsługa zdarzeń wejścia potrafi poważnie zmulić aplikację. Dodanie spania w obsłudze zdarzeń wątku UI rozwiązuje problem....

    Tak, czytałem że zdarzenia wejścia potrafią nieźle namieszać i że trzeba usypiać ich wątek, ale to nie to bo zrywy są nawet gdy nie dotyka się ekranu i klawiszy. A gdy dotknę ekranu i pojawi się tam lecący obiekt to nie widać w momencie dotknięcią jakiegoś wyraźnego spadku wydajności.

    Canvas raczej nic nie alokuje, z tego co wyczytałem Allocation Tracker podpina się bezpośrednio do Dalvika i pokazuje wszystko. Można też tam odpalić ręcznie GC i zobaczyć ilość zaalokowanych obiektów - w moim przypadku po przeróbkach programu na nic nie alokujący wartość ta pozostaje stała.

    ---------- Post dołączono o 23:35 ---------- Poprzedni post napisano o 15:56 ----------

    Ciężko to pokazać, ale nie odświeżając tła widać smugi po 3-ech poruszających się obiektach i te smugi w momentach "zrywu" zostawiają małe przerwy.

    device2.png

    Patrząc na gry z marketu ciężko stwierdzić jak one są rysowane, przykładowo Jewels działa płynnie (lub tego poprostu nie widać bo gra jest w większości statyczna). Abduction niby działa płynnie ale jak zatrzymamy się w miejscu i patrzymy na poruszającą się chmurkę to widać właśnie ten efekt przycinania raz na pare sekund.

    Teraz pytanie czy to tylko kwestia Spicy czy rysowania po canvasie ?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    jak już pisałem a nie lubię się powtarzać, to może nie mieć żadnego związku z programem wiec sprawdź na emulatorze na niższej rozdzielczości (320x480) na pewno animacja jeżeli nie płynna to przynajmniej grywalna będzie i jakieś obserwacje będzie można poczynić

    PS.

    wydajność emulatora nie ma nic do wydajności komputera (chyba ze jest bardzo słaby) na moim PC emulator Androida 2.3 działa tak ze nie sposób go używać a mam staje roboczą i wątpię zęby moje 6 jajek nie dawało rady choć z tego o widzę emulator nie wspiera wielowątkowości to i tak procesor daje rade

    Edytowane przez zawadaki

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    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ę

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x