Antworten:
Alle Ansichten werden auf demselben GUI-Thread gezeichnet, der auch für alle Benutzerinteraktionen verwendet wird.
Wenn Sie also die GUI schnell aktualisieren müssen oder wenn das Rendern zu lange dauert und die Benutzererfahrung beeinträchtigt, verwenden Sie SurfaceView
.
Ein paar Dinge, die ich bemerkt habe:
Weitere Informationen (und ein gutes Anwendungsbeispiel) finden Sie im LunarLander-Projekt im Abschnitt mit den Beispielen des SDK.
aktualisiert am 05.09.2014
OK. Wir haben jetzt ein offizielles Dokument. Es sprach alles, was ich erwähnt habe, besser.
Lesen Sie mehr detailliert hier .
Ja, der Hauptunterschied besteht darin, dass SurfaceView im Hintergrund-Thread aktualisiert werden kann. Es gibt jedoch noch mehr, die Sie interessieren könnten.
surfaceView hat einen Oberflächenpuffer zugewiesen, während alle Ansichten einen Oberflächenpuffer gemeinsam nutzen, der von ViewRoot zugewiesen wird. Mit anderen Worten, SurfaceView kostet mehr Ressourcen.
SurfaceView kann nicht hardwarebeschleunigt werden (ab JB4.2), während 95% der Vorgänge in der normalen Ansicht mit openGL ES HW-beschleunigt werden.
Es sollte mehr Arbeit geleistet werden, um Ihre angepasste Oberflächenansicht zu erstellen. Sie müssen das SurfaceCreated / Destroy-Ereignis abhören, einen Render-Thread erstellen und vor allem den Render-Thread und den Haupt-Thread synchronisieren. Um die Ansicht anzupassen, müssen Sie jedoch nur die onDraw
Methode überschreiben .
view.invalidate
den UI-Thread oder einen view.postInvalid
anderen Thread auf, um dem Framework anzuzeigen, dass die Ansicht aktualisiert werden soll. Die Ansicht wird jedoch nicht sofort aktualisiert, sondern wartet, bis das nächste VSYNC-Ereignis eintrifft. Der einfache Ansatz, um VSYNC zu verstehen, besteht darin, es als Timer zu betrachten, der alle 16 ms für einen 60-fps-Bildschirm startet. In Android wird das gesamte normale Ansichtsupdate (und die Anzeige tatsächlich, aber ich werde heute nicht darüber sprechen) mit VSYNC synchronisiert, um eine bessere Glätte zu erzielen. Zurück zur Oberflächenansicht können Sie sie jederzeit nach Belieben rendern. Ich kann jedoch kaum sagen, ob dies von Vorteil ist, da die Anzeige, wie bereits erwähnt, auch mit VSYNC synchronisiert ist.Der Hauptunterschied besteht darin, dass SurfaceView
Hintergrundköpfe darauf zurückgreifen Views
können, dies aber nicht können.
SurfaceViews
Verwenden Sie jedoch mehr Ressourcen, damit Sie sie nicht verwenden möchten, es sei denn, Sie müssen.
A SurfaceView
ist eine benutzerdefinierte Ansicht in Android, mit der Sie darin zeichnen können.
Der Hauptunterschied zwischen a View
und a SurfaceView
besteht darin, dass in der eine Ansicht gezeichnet wird
UI Thread
, die für die gesamte Benutzerinteraktion verwendet wird.
Wenn Sie die Benutzeroberfläche schnell genug aktualisieren und eine gute Menge an Informationen darin rendern möchten, ist eine SurfaceView die bessere Wahl.
Es gibt jedoch einige technische Aspekte SurfaceView
:
1. Sie sind nicht hardwarebeschleunigt.
2. Normale Ansichten werden gerendert, wenn Sie die Methoden invalidate
oder aufrufen. postInvalidate()
Dies bedeutet jedoch nicht, dass die Ansicht sofort aktualisiert wird (A VSYNC
wird gesendet und das Betriebssystem entscheidet, wann sie aktualisiert wird. Die SurfaceView
kann sofort aktualisiert werden.
3. Eine SurfaceView hat eine zugewiesene surface buffer
, so ist es teurer
Einer der Hauptunterschiede zwischen Oberflächenansicht und Ansicht besteht darin, dass zum Aktualisieren des Bildschirms für eine normale Ansicht die Methode "Ungültig machen" aus demselben Thread aufgerufen werden muss, in dem die Ansicht definiert ist. Aber selbst wenn wir ungültig nennen, erfolgt die Aktualisierung nicht sofort. Sie tritt erst nach dem nächsten Eintreffen des VSYNC-Signals auf. Das VSYNC-Signal ist ein vom Kernel erzeugtes Signal, das alle 16,6 ms auftritt, oder dies wird auch als 60 Bilder pro Sekunde bezeichnet. Wenn wir also mehr Kontrolle über die Aktualisierung des Bildschirms haben möchten (z. B. für sehr schnelllebige Animationen), sollten wir keine normale Ansichtsklasse verwenden.
Auf der anderen Seite können wir bei der Oberflächenansicht den Bildschirm so schnell aktualisieren, wie wir möchten, und dies über einen Hintergrund-Thread. Das Aktualisieren der Oberflächenansicht hängt also nicht wirklich von VSYNC ab, und dies ist sehr nützlich, wenn wir Hochgeschwindigkeitsanimationen erstellen möchten. Ich habe nur wenige Schulungsvideos und eine Beispielanwendung, die all diese Dinge gut erklären. Bitte schauen Sie sich die folgenden Trainingsvideos an.
Warum SurfaceView und nicht die klassische View-Klasse verwenden ...
Ein Hauptgrund ist, dass SurfaceView den Bildschirm schnell rendern kann.
Mit einfachen Worten, ein SV ist besser in der Lage, das Timing zu verwalten und Animationen zu rendern.
Um besser zu verstehen, was eine SurfaceView ist, müssen wir sie mit der View-Klasse vergleichen.
Was ist der Unterschied ... überprüfen Sie diese einfache Erklärung im Video
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Nun, mit der Ansicht haben wir ein großes Problem ... das Timing des Renderns von Animationen.
Normalerweise wird onDraw () vom Android-Laufzeitsystem aufgerufen.
Wenn das Android-Laufzeitsystem onDraw () aufruft, kann die Anwendung nicht steuern
das Timing der Anzeige, und dies ist wichtig für die Animation. Wir haben eine Zeitlücke
zwischen der Anwendung (unserem Spiel) und dem Android-Laufzeitsystem.
Der SV kann onDraw () von einem dedizierten Thread aufrufen.
Also: Die Anwendung steuert das Timing. So können wir das nächste Bitmap-Bild der Animation anzeigen.