2009-08-07 10 views

Respuesta

174

Todas las vistas se dibujan en el mismo subproceso de GUI que también se utiliza para todas las interacciones del usuario.

Por lo tanto, si necesita actualizar la GUI rápidamente o si la renderización requiere demasiado tiempo y afecta la experiencia del usuario, utilice SurfaceView.

+2

Revise la respuesta de pierr que contiene más detalles. –

+3

Respuesta oficial detallada: http://developer.android.com/guide/topics/graphics/2d-graphics.html –

+0

Ya no es tan simple. Verifique la respuesta de Pierr; tiene un enlace al documento de arquitectura detallado (https://source.android.com/devices/graphics/architecture.html) y explica por qué la aceleración de hardware de la representación de Lienzo puede hacer que las Vistas personalizadas sean una mejor opción. – fadden

40

La diferencia principal es que SurfaceView se puede dibujar por las líneas de fondo pero Views no. SurfaceViews usa más recursos, por lo que no querrás usarlos a menos que sea necesario.

+0

"Ellos usan más recursos, aunque por lo que no desea utilizarlos a menos que tenga que hacerlo." - ¿Quién usa más recursos? Vistas o Vistas de superficie? – Dror

+6

Surfaceview usa más recursos que vistas –

+0

@RiteshGune ¿cuánto? –

92

Algunas cosas que he notado:

  • SurfaceViews contienen un mecanismo de representación agradable que permite a los hilos para actualizar el contenido de la superficie sin necesidad de utilizar un controlador (bueno para la animación).
  • Vistas de superficie no pueden ser transparentes, solo pueden aparecer detrás de otros elementos en la jerarquía de vista.
  • Descubrí que son mucho más rápidos para la animación que la representación 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 .

+29

FYI ... Un SurfaceView ahora puede ser transparente: http://stackoverflow.com/questions/5391089/how-to-make-surfaceview-transparent – Steve

+4

¡Cómo progresa el tiempo! – Ralphleon

+0

@Ralphleon: ¿Qué quieres decir con Vistas de superficie no puede ser transparente? ¿Pueden otras vistas superponerse a la vista de superficie? Por ejemplo, ¿puedo mostrar un ListView en una vista de superficie temporalmente? – Ashwin

62

actualizado 05/09/2014

OK. Tenemos official document now. Habló todo lo que he mencionado, de una mejor manera.


Más información detallada here.

Sí, la diferencia principal es surfaceView se puede actualizar en el hilo de fondo. Sin embargo, hay más que podría importarte.

  • surfaceView ha dedicado el búfer de superficie mientras que toda la vista comparte un búfer de superficie asignado por ViewRoot. En otras palabras, surfaceView cuesta más recursos.

  • surfaceView no se puede acelerar por hardware (a partir de JB4.2) mientras que el 95% de las operaciones en la Vista normal se aceleran en HW con OpenGL ES.

  • Se debe trabajar más para crear su SurfaceView personalizado. Necesita escuchar el evento SurfaceCreated/Destroy, crear un hilo de renderizado, lo que es 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 método onDraw.

  • El tiempo de actualización es diferente. El mecanismo de actualización de vista normal está restringido o controlado por el marco: llama al view.invalidate en el hilo de la interfaz de usuario o al view.postInvalid en otro hilo para indicar al marco que la vista debe actualizarse. Sin embargo, la vista no se actualizará inmediatamente, sino que esperará hasta que llegue el próximo evento VSYNC. El enfoque fácil para entender VYSNC es considerar que es como un temporizador que se dispara cada 16 ms para una pantalla de 60 fps.En Android, toda la actualización de vista normal (y la pantalla en realidad, pero no voy a hablar hoy), se sincroniza con VSYNC para lograr una mejor suavidad. Ahora, de vuelta a SurfaceView, puede renderizarlo 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.
+1

De su respuesta me da la sensación de que es mejor usar una clase derivada de Vista que SurfaceView. ¿O estoy recibiendo algo mal? Esto se opondría a la mayoría de los tutoriales de desarrollo de juegos 2D. – Storm

+2

@Storm algo a tener en cuenta es que un SurfaceView por diseño no debe bloquear el subproceso UI donde una vista solo puede ser modificada por el subproceso UI. Con la mayoría de los juegos, SurfaceViews hará un buen renderizado que bloquearía el subproceso UI con una vista simple. Ese es el principal beneficio, desde mi entendimiento, de un SurfaceView. – zgc7009

9

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

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

Si desea actualizar la interfaz de usuario con la suficiente rapidez y representar una buena cantidad de información en , una SurfaceView es una mejor opción.

Pero hay algunas técnicas al interior SurfaceView:

1. No son aceleradas por hardware.

2. vistas normales se vuelven cuando se llama a los métodos invalidate o postInvalidate(), pero esto no significa que la vista se inmediatamente actualizado (A VSYNC será enviado, y el sistema operativo decide cuándo que ésta se actualiza. La SurfaceView se pueden actualizar de inmediato

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

0

Otra definición sería:.

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

Fuente: La Guía de Big Nerd Ranch

4

Una de las principales diferencias entre SurfaceView y la vista es que para actualizar la pantalla para una visualización normal tenemos que llamar a invalidar método desde el mismo hilo donde la vista es definido. Pero incluso si llamamos invalida, 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 también se conoce como 60 cuadros por segundo. Por lo tanto, si queremos tener más control sobre la actualización de la pantalla (por ejemplo, para una animación muy rápida), no deberíamos usar la clase de vista normal.

Por otro lado, en el caso de SurfaceView, podemos actualizar la pantalla lo más rápido que queramos y podemos hacerlo desde un hilo de fondo. Por lo tanto, refrescar la vista superficial realmente no depende de VSYNC, y esto es muy útil si queremos hacer una animación de alta velocidad. Tengo algunos videos de entrenamiento y aplicaciones de ejemplo que explican muy bien todas estas cosas. Por favor, eche un vistazo a los siguientes videos de entrenamiento.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

+0

No se encontraron videos !! –

+0

corregido ....... –

Cuestiones relacionadas