2010-10-19 10 views
7

jeszcze nie deweloper, tylko próbuje dowiedzieć się, czy android aplikacja może zrobić, co trzeba ..Controlling odświeżania wyświetlacza na urządzeniu Android

Co potrzebne:

prosta aplikacja, która wyświetla pełna klatka jednego koloru na ekranie przy określonej intensywności przy stałej częstotliwości! Potrzebuję go do synchronizacji z możliwie wysoką rozdzielczością (osiągniętą poprzez zmianę intensywności w znanym schemacie z możliwie wysoką stałą częstotliwością).

Jakie pytania mam:

  1. Czy androidem run Urządzenie z stałej częstotliwości wyświetlania czy istnieje jakiś sposób, aby ustawić go stałym częstotliwością 60 kl./s powiedzieć?

  2. Jeśli stałej częstotliwości może być osiągnięty, jest tam vsync przerwania lub coś podobnego, który umożliwia mi zmienić intensywność na ekranie w odpowiednim czasie.

  3. Jeśli powyższe dwie rzeczy mogą być uzyskane, które podejście muszę do podjęcia. Myślę, że muszę patrzeć na OpenGL ES i być może NDK .... Czy ktoś proszę mi punkt w dobrym kierunku ....

Odpowiedz

9

spodziewałbym częstotliwość odświeżania do zamocowania na poziomie sterowników sprzętu lub ekranu. Jest an API for finding out what it is, ale wątpię, czy możesz to ustawić.

Napisałem grę, która zaimplementowała stałą liczbę klatek na sekundę 40 klatek na sekundę. Podstawową techniką było narysowanie wszystkiego do bufora poza ekranem ... coś, co dzieje się automatycznie z GL, ale które musi być wykonane ręcznie, jeśli używamy Canvas.

Po zakończeniu kosztownej i zmiennej długości rysowania sceny poza ekranem, możesz zablokować wątek renderowania (lub wykonać inną pracę), aż nadejdzie czas renderowania. Dzięki temu każda klatka będzie wyświetlana w równych odstępach czasu. Zapewnia to przyjemny płynny ruch z premią, że nie spalasz baterii, rysując za dużo (coś, co wiele aplikacji opartych na GL robi, ponieważ używają RENDERMODE_CONTINUOUSLY bez żadnego powodu).

+0

Dziękuję bardzo Reuben! – Mathias

+0

Dziękuję bardzo za odpowiedź Reuben! To ma sens, że wyświetlacz działa na stałej częstotliwości na poziomie sprzętowym i że za pomocą getRefreshRate() można uzyskać częstotliwość odświeżania wyświetlacza i używać go w mojej synchronizacji, więc jedyne pytanie, które pozostaje, to skąd mam wiedzieć, kiedy wyświetlacz został wyrenderowany. Czy istnieje przerwanie vsync lub coś podobnego do kontrolowania mojego licznika klatek, który mogę wykorzystać w generowaniu intensywności? – Mathias

+0

Miło jest spotkać kolegę starszego programisty, który wyraźnie pamięta, jak ważne jest robienie jak najwięcej w pionowym okresie wygaszania ... :) –

0

Mathias,

Tak więc, jeśli chcesz zsynchronizować z wyświetlaczem na Androidzie, po prostu niech android powiedzieć, kiedy widok musi być sporządzone - co jest najbardziej podstawowe rzeczy się robi na Androida. Będziesz wywodził klasę z podanej w Androidzie klasy View. Zastąpisz klasę View metody onDraw(), którą android będzie wywoływał za każdym razem, gdy widok wymaga odświeżenia.

Jeśli chcesz się upewnić, że każda wyświetlana klatka ma określony czas, prawdopodobnie będziesz chciał ustawić nowy wątek. W nowym wątku wprowadzisz pętlę synchronizacji - zacznij od przechwycenia System.nanoTime() (jednej miliardowej sekundy rozdzielczości) do zmiennej, a następnie wykonaj pętlę, aż osiągniesz żądaną długość ramki, a następnie zaktualizuj globalną statyczną zmienną logiczną. Ta globalna statyczna wartość logiczna może zostać sprawdzona w metodzie onDraw() w celu określenia, kiedy należy zmienić intensywność.

Powiązane problemy