2012-06-27 7 views
7

Renderuję obiekty za pomocą OpenGL, a w większości sytuacji uzyskuję ładną płynność w 60 klatkach na sekundę. DO ZROBIENIA zrobić coś ciężkiego w wątku w tle, jak pobieranie rzeczy z interfejsu API REST, przetwarzanie go i dodawanie obiektów do wykresu (rzeczy o niskim priorytecie, zależy mi bardziej na płynności interfejsu użytkownika). Renderowanie zatrzymuje się następnie na bardzo długi okres, do 1 sekundy (o ile działa wątek tła), a następnie wznawia się tak, jakby nic się nie stało. Zauważyłem to, ponieważ animacja jest uruchamiana w tym samym czasie i utknie ona w tym okresie. Wątek tła ma minimalny priorytet, a odśmiecanie trwa do 100-200 ms, ale nie przez całą sekundę. Gdy ustawiam punkt debugowania w dowolnym miejscu w zadaniu tła, renderowanie będzie kontynuowane bez żadnych opóźnień.Android: renderowanie OpenGL zatrzymuje się, gdy ciężkie zadanie działa w tle.

Czy to możliwe, że mój wątek z grubym tłem zagłodzi wątek OpenGL? Jeśli tak, co mogę zrobić?

+0

Na jakim GPU testujesz? –

+0

Wygląda podejrzanie jak [ten ślad wydajności] (http://stackoverflow.com/q/9612959/1262542) ... –

+0

Niedoszły GPU, to Galaxy Nexus. Sprawdzę to na symulatorze, kiedy wrócę do domu. – manmal

Odpowiedz

1

Oczywiście! GPU musi być zasilane danymi, a to odbywa się przez CPU. Tak więc, jeśli coś w wąskich gardłach systemu, takich jak przetwarzanie we/wy lub procesora, wtedy GPU nie może zostać nakarmione. Na przykład animacja jest tradycyjnie wykonywana na procesorze. Właśnie dlatego na komputerze dostaje się dużo gier, które uzyskują większą liczbę klatek na sekundę z tymi samymi układami graficznymi, ale z różnymi procesorami.

Zgadzam się również, że profilowanie to bardzo dobry pomysł. Jeśli możesz, proponuję profilowanie, aby upewnić się, że jest to rzeczywiście wywołanie REST lub jeśli wywołanie REST jest jedną z wielu rzeczy. Jedna rzecz, którą zauważyłem podczas przetwarzania REST, i to mi się przydarzyło. Ponieważ REST czasami przetwarza wiele ciągów znaków, a jeśli nie używasz StringBuilder, możesz zakończyć odpalanie wielu śmieci. Jednak nie brzmi to tak, jakbyś to rozumiał.

+1

Dlaczego więc planista powinien mieć możliwość umieszczenia wątku tła przed dostarczeniem rury GPU? To nie ma sensu. Jeśli tak, to dlaczego inżynierowie Google nie tylko nadali temu wątkowi renderowania wyższy priorytet? – manmal

+0

Czasami Java musi zwolnić pamięć RAM, szczególnie w przypadku wywołania REST, które zwykle wykonuje trochę przetwarzania ciągów znaków. –

+1

Wspomniałem już, że odśmiecanie nie może tu stanowić problemu, ponieważ wstrzymywanie GC nie jest tak długie. Są bardziej podobne do 100-200ms w maksimum, a nie 1,5 sekundy. – manmal