¿Cuándo es necesario o mejor usar un en SurfaceView
lugar de un View
?
211
Las vistas se dibujan en el mismo hilo GUI que también se usa para toda la interacción del usuario.
Entonces, si necesita actualizar la GUI rápidamente o si el renderizado toma demasiado tiempo y afecta la experiencia del usuario, úselo SurfaceView
.
Algunas cosas que he notado:
Para obtener más información (y un excelente ejemplo de uso), consulte el proyecto LunarLander en la sección de ejemplos del SDK.
fuente
actualizado 05/09/2014
OKAY. Tenemos documento oficial ahora. Habló todo lo que he mencionado, de una mejor manera.
Leer más detallado aquí .
Sí, la principal diferencia es que SurfaceView se puede actualizar en el hilo de fondo. Sin embargo, hay más que te pueden interesar.
SurfaceView ha dedicado el buffer de superficie, mientras que toda la vista comparte un buffer de superficie asignado por ViewRoot. En otras palabras, SurfaceView cuesta más recursos.
SurfaceView no puede ser acelerado por hardware (a partir de JB4.2), mientras que el 95% de las operaciones en Vista normal se aceleran con HW usando openGL ES.
Se debe hacer más trabajo para crear su SurfaceView personalizada. Debe escuchar el evento SurfaceCreated / Destroy, crear un hilo de renderizado, y lo más importante, sincronizar el hilo de renderizado y el hilo principal. Sin embargo, para personalizar la Vista, todo lo que necesita hacer es anular el
onDraw
método.view.invalidate
al hilo de la interfaz de usuario oview.postInvalid
en otro hilo para indicarle al marco que la vista debe actualizarse. Sin embargo, la vista no se actualizará de inmediato, pero espere hasta que llegue el próximo evento VSYNC. El enfoque fácil para entender VSYNC es considerarlo como un temporizador que se activa cada 16 ms para una pantalla de 60 fps. En Android, toda la actualización de la vista normal (y la pantalla en realidad, pero no hablaré hoy), se sincroniza con VSYNC para lograr una mejor suavidad. Ahora, de vuelta a SurfaceView, puede renderizarlo en cualquier momento que lo desee. Sin embargo, apenas puedo decir si es una ventaja, ya que la pantalla también está sincronizada con VSYNC, como se indicó anteriormente.fuente
La principal diferencia es que
SurfaceView
pueden ser dibujados por cabezas de fondo peroViews
no pueden.SurfaceViews
sin embargo, use más recursos para no querer usarlos a menos que tenga que hacerlo.fuente
A
SurfaceView
es una vista personalizada en Android que se puede usar para dibujar dentro de ella.La principal diferencia entre ay
View
aSurfaceView
es que se dibuja una Vista enUI Thread
, que se utiliza para toda la interacción del usuario.Si desea actualizar la interfaz de usuario lo suficientemente rápido y generar una buena cantidad de información en ella, SurfaceView es una mejor opción.
Pero hay algunos detalles técnicos para
SurfaceView
:1. No son acelerados por hardware.
2. Las vistas normales se representan cuando llama a los métodos
invalidate
opostInvalidate()
, pero esto no significa que la vista se actualizará inmediatamente (VSYNC
se enviará A, y el sistema operativo decide cuándo se actualizará. SeSurfaceView
puede actualizar de inmediato.3. Un SurfaceView tiene un asignado
surface buffer
, por lo que es más costosofuente
Una de las principales diferencias entre la vista de superficie y la vista es que para actualizar la pantalla para una vista normal tenemos que llamar al método invalidar desde el mismo hilo donde se define la vista. Pero incluso si llamamos invalidar, la actualización no ocurre de inmediato. Ocurre solo después de la próxima llegada de la señal VSYNC. La señal VSYNC es una señal generada por el núcleo que ocurre cada 16,6 ms o esto también se conoce como 60 cuadros por segundo. Entonces, si queremos tener más control sobre la actualización de la pantalla (por ejemplo, para una animación de movimiento muy rápido), no debemos usar la clase de vista normal.
Por otro lado, en caso de SurfaceView, podemos actualizar la pantalla tan rápido como queramos y podemos hacerlo desde un hilo de fondo. Por lo tanto, la actualización de la vista de superficie realmente no depende de VSYNC, y esto es muy útil si queremos hacer animación de alta velocidad. Tengo pocos videos de entrenamiento y aplicaciones de ejemplo que explican todas estas cosas muy bien. Por favor, eche un vistazo a los siguientes videos de capacitación.
https://youtu.be/kRqsoApOr9U
https://youtu.be/Ji84HJ85FIQ
https://youtu.be/U8igPoyrUf8
fuente
¿Por qué usar SurfaceView y no la clase clásica de Vista ...
Una razón principal es que SurfaceView puede renderizar rápidamente la pantalla.
En palabras simples, un SV es más capaz de gestionar el tiempo y renderizar animaciones.
Para comprender mejor qué es un SurfaceView, debemos compararlo con la clase View.
¿Cuál es la diferencia ... verifique esta explicación simple en el video
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Bueno, con la Vista tenemos un problema importante ... el momento de renderizar animaciones.
Normalmente se llama a onDraw () desde el sistema de tiempo de ejecución de Android.
Entonces, cuando el sistema de tiempo de ejecución de Android llama a onDraw (), la aplicación no puede controlar
el tiempo de visualización, y esto es importante para la animación. Tenemos una brecha de tiempo
entre la aplicación (nuestro juego) y el sistema de tiempo de ejecución de Android.
El SV puede llamar al onDraw () por un hilo dedicado.
Por lo tanto: la aplicación controla el tiempo. Entonces podemos mostrar la siguiente imagen de mapa de bits de la animación.
fuente