studio drawpath drawcircle drawables android graphics 2d

android - drawpath - ¿Diferencia entre SurfaceView y View?



vector android studio (8)

¿Por qué usar SurfaceView y no la clase de vista clásica ...

Una razón principal es que SurfaceView puede procesar rápidamente la pantalla.

En palabras simples, un SV es más capaz de administrar el tiempo y renderizar las animaciones.

Para comprender mejor qué es un SurfaceView, debemos compararlo con la clase View.

¿Cuál es la diferencia ... mira 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 en que se presentan las animaciones.

Normalmente se llama a onDraw () desde el sistema de tiempo de ejecución de Android.

Por lo tanto, cuando el sistema Android en tiempo de ejecución llama a OnDraw (), la aplicación no puede controlar

El tiempo de visualización, y esto es importante para la animación. Tenemos un intervalo de tiempo

entre la aplicación (nuestro juego) y el sistema de ejecución de Android.

El SV puede llamar al onDraw () por un hilo dedicado.

Por lo tanto: la aplicación controla el tiempo. Así podemos mostrar la siguiente imagen de mapa de bits de la animación.

¿Cuándo es necesario, o mejor usar un SurfaceView lugar de una View ?


Algunas cosas que he notado:

  • SurfaceViews contiene un mecanismo de representación agradable que permite que los subprocesos actualicen el contenido de la superficie sin usar un controlador (bueno para la animación).
  • Las vistas de superficie no pueden ser transparentes, solo pueden aparecer detrás de otros elementos en la jerarquía de vistas.
  • Descubrí que son mucho más rápidos para la animación que para renderizar en una Vista.

Para obtener más información (y un excelente ejemplo de uso), consulte el proyecto LunarLander en la sección de ejemplos del SDK.


La principal diferencia es que SurfaceView se puede dibujar con fondos de fondo, pero las Views no. SurfaceViews embargo, SurfaceViews utiliza más recursos, por lo que no querrá usarlos a menos que tenga que hacerlo.


Otra definición sería:

Un SurfaceView es una vista especial que le permite representar contenido directamente en la pantalla.

Fuente: Guía de The Big Nerd Ranch


Todas las vistas se dibujan en el mismo hilo de la 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, use SurfaceView .


Una SurfaceView es una vista personalizada en Android que se puede usar para dibujar dentro de ella.

La principal diferencia entre una View y un SurfaceView es que una vista se dibuja en el UI Thread la UI Thread , que se utiliza para toda la interacción del usuario.

Si desea actualizar la IU lo suficientemente rápido y generar una buena cantidad de información en ella, SurfaceView es una mejor opción.

Pero hay algunos aspectos técnicos de SurfaceView :

1. No son acelerados por hardware.

2. Las vistas normales se procesan cuando llama a los métodos invalidate o postInvalidate() , pero esto no significa que la vista se actualizará inmediatamente ( VSYNC enviará un VSYNC y el sistema operativo decidirá cuándo se actualizará. SurfaceView se puede actualizar inmediatamente .

3. Un SurfaceView tiene un surface buffer asignado, por lo que es más costoso


Una de las principales diferencias entre la vista de superficie y la vista es que para actualizar la pantalla para una vista normal, debemos llamar al método de invalidar desde el mismo hilo en el que se define la vista. Pero incluso si llamamos inválido, 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 kernel que ocurre cada 16.6 ms o esto también se conoce como 60 cuadros por segundo. Por lo tanto, si queremos más control sobre la actualización de la pantalla (por ejemplo, para animaciones que se mueven muy rápido), no debemos usar la clase de vista normal.

Por otro lado, en caso de una vista de superficie, podemos actualizar la pantalla tan rápido como queramos y podemos hacerlo desde un hilo de fondo. La actualización de la vista de superficie realmente no depende de VSYNC, y esto es muy útil si queremos hacer una 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


actualizado el 05/09/2014

DE ACUERDO. Tenemos documento oficial ahora. Hablaba todo lo que he mencionado, de una mejor manera.

Leer más detallado here .

Sí, la principal diferencia es que surfaceView puede actualizarse en el hilo de fondo. Sin embargo, hay más que te pueden interesar.

  • surfaceView tiene un búfer de superficie dedicado, mientras que toda la vista comparte un búfer de superficie asignado por ViewRoot. En otra palabra, surfaceView cuesta más recursos.

  • surfaceView no puede ser acelerado por hardware (a partir de JB4.2), mientras que las operaciones del 95% en vista normal son aceleradas por HW usando openGL ES.

  • Debe hacerse más trabajo para crear su surfaceView personalizado. Debe escuchar el evento SurfaceCreated / Destroy, crear un subproceso de procesamiento y, lo que es más importante, sincronizar el subproceso de procesamiento y el subproceso principal. Sin embargo, para personalizar la Vista, todo lo que necesita hacer es anular el método onDraw .

  • El momento para actualizar es diferente. El mecanismo de actualización de la vista normal está restringido o controlado por el marco: llama a view.invalidate en el subproceso de la interfaz de usuario o view.postInvalid en otro subproceso para indicar 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 VYSNC es considerar que es como un temporizador que se enciende cada 16 ms en una pantalla de 60 fps. En Android, toda la actualización de vista normal (y la visualización en realidad, pero no hablaré hoy), se sincroniza con VSYNC para lograr una mejor suavidad. Ahora, volviendo a la vista de superficie, puede renderizarla en cualquier momento que desee. Sin embargo, apenas puedo decir si es una ventaja, ya que la pantalla también está sincronizada con VSNC, como se indicó anteriormente.