Odpowiedzi:
Widoki są rysowane w tym samym wątku GUI, który jest również używany do wszystkich interakcji użytkownika.
Więc jeśli musisz szybko zaktualizować GUI lub jeśli renderowanie zajmuje zbyt dużo czasu i wpływa na wrażenia użytkownika, użyj SurfaceView
.
Kilka rzeczy, które zauważyłem:
Aby uzyskać więcej informacji (i świetny przykład użycia), zapoznaj się z projektem LunarLander w sekcji przykładów SDK.
zaktualizowano 05/09/2014
DOBRZE. Mamy teraz oficjalny dokument. Mówił wszystko, co wspomniałem, w lepszy sposób.
Przeczytaj więcej tutaj .
Tak, główna różnica polega na tym, że SurfaceView można aktualizować w wątku tła. Jest jednak coś, co może Cię obchodzić.
SurfaceView ma dedykowany bufor powierzchni, podczas gdy cały widok ma jeden bufor powierzchni przydzielony przez ViewRoot. Innymi słowy, SurfaceView kosztuje więcej zasobów.
SurfaceView nie może być przyspieszany sprzętowo (od JB4.2), podczas gdy 95% operacji w normalnym widoku jest przyspieszane sprzętowo przy użyciu OpenGL ES.
Należy wykonać więcej pracy, aby utworzyć niestandardową powierzchnię. Musisz nasłuchiwać zdarzenia SurfaceCreated / Destroy, utworzyć wątek renderujący, a co ważniejsze, zsynchronizować wątek renderujący i wątek główny. Aby jednak dostosować widok, wystarczy tylko przesłonić onDraw
metodę.
view.invalidate
w wątku interfejsu użytkownika lub view.postInvalid
w innym wątku, aby wskazać frameworkowi, że widok powinien zostać zaktualizowany. Jednak widok nie zostanie natychmiast zaktualizowany, ale poczekaj, aż nadejdzie następne zdarzenie VSYNC. Łatwe podejście do zrozumienia VSYNC polega na uznaniu, że jest to zegar, który uruchamia się co 16 ms dla ekranu 60 klatek na sekundę. W Androidzie wszystkie normalne aktualizacje widoku (i wyświetlane w rzeczywistości, ale dzisiaj nie będę o tym mówić) są zsynchronizowane z VSYNC, aby uzyskać lepszą płynność. Teraz wracając do SurfaceView, możesz wyrenderować go w dowolnym momencie. Jednak nie mogę powiedzieć, czy jest to zaletą, ponieważ wyświetlacz jest również synchronizowany z VSYNC, jak wspomniano wcześniej.Główną różnicą jest to, że SurfaceView
można na niej wyciągnąć teady tła, ale Views
nie można.
SurfaceViews
użyj więcej zasobów, więc nie chcesz ich używać, chyba że musisz.
A SurfaceView
to niestandardowy widok w Androidzie, którego można używać do rysowania w nim.
Główną różnicą między a View
i a SurfaceView
jest to, że rysowany jest widok
UI Thread
, który jest używany do wszystkich interakcji użytkownika.
Jeśli chcesz zaktualizować interfejs użytkownika wystarczająco szybko i wyświetlić w nim dużą ilość informacji, SurfaceView jest lepszym wyborem.
Ale istnieje kilka technicznych aspektów SurfaceView
:
1. Nie są przyspieszane sprzętowo.
2. Zwykłe widoki są renderowane podczas wywoływania metody invalidate
lub postInvalidate()
, ale to nie znaczy, że widok zostanie natychmiast zaktualizowany (A VSYNC
zostanie wysłana, a system operacyjny decyduje, kiedy jest ona aktualizowana. Na SurfaceView
mogą być natychmiast aktualizowane.
3. SurfaceView ma przydzielony surface buffer
, więc jest bardziej kosztowny
Jedną z głównych różnic między podglądem powierzchni a widokiem jest to, że aby odświeżyć ekran dla normalnego widoku, musimy wywołać metodę unieważnienia z tego samego wątku, w którym widok jest zdefiniowany. Ale nawet jeśli wywołamy unieważnienie, odświeżanie nie nastąpi natychmiast. Występuje dopiero po kolejnym nadejściu sygnału VSYNC. Sygnał VSYNC jest sygnałem generowanym przez jądro, które zdarza się co 16,6 ms lub jest to również znane jako 60 ramek na sekundę. Jeśli więc chcemy mieć większą kontrolę nad odświeżaniem ekranu (na przykład w przypadku bardzo szybko poruszającej się animacji), nie powinniśmy używać normalnej klasy widoku.
Z drugiej strony, w przypadku podglądu powierzchni, możemy odświeżyć ekran tak szybko, jak chcemy i możemy to zrobić z wątku w tle. Odświeżenie widoku powierzchni naprawdę nie zależy od VSYNC, a jest to bardzo przydatne, jeśli chcemy wykonać szybką animację. Mam kilka filmów szkoleniowych i przykładową aplikację, która ładnie wyjaśnia wszystkie te rzeczy. Obejrzyj następujące filmy szkoleniowe.
Dlaczego warto korzystać z SurfaceView, a nie z klasycznej klasy View ...
Jednym z głównych powodów jest to, że SurfaceView może szybko renderować ekran.
Krótko mówiąc, SV jest bardziej zdolny do zarządzania czasem i renderowania animacji.
Aby lepiej zrozumieć, czym jest SurfaceView, musimy porównać go z klasą View.
Jaka jest różnica ... sprawdź to proste wyjaśnienie w filmie
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Cóż, z Widokiem mamy jeden poważny problem ... czas renderowania animacji.
Zwykle funkcja onDraw () jest wywoływana z systemu wykonawczego Android.
Tak więc, gdy system wykonawczy Android wywołuje funkcję onDraw (), wówczas aplikacja nie może kontrolować
czas wyświetlania, a to jest ważne dla animacji. Mamy luki czasowe
między aplikacją (naszą grą) a systemem wykonawczym Android.
SV może wywołać onDraw () przez dedykowany wątek.
Zatem: aplikacja kontroluje czas. Możemy więc wyświetlić następny obraz bitmapowy animacji.