Android: Lienzo vs OpenGL
Tengo una aplicación de dibujo donde el usuario puede dibujar líneas con el dedo, ajustar el color, grosor, etc. A medida que el usuario dibuja, estoy convirtiendo los puntos X / Y de MotionEvent
en SVG Paths , Y luego dibujar los caminos de Android a la pantalla a través de un lienzo, y el compromiso de la ruta de acceso SVG a la base de datos de la aplicación.
Estoy siguiendo el modelo utilizado en FingerPaint , en que las líneas "en progreso" son dibujadas sobre la marcha mediante llamadas repetidas a invalidate()
(y, por tanto, onDraw()
), y una vez que la línea está completa y se inicia una nueva línea , La (s) línea (s) anterior (es) se dibujan en onDraw()
del Bitmap
subyacente de la Canvas
, con líneas de progreso generando nuevamente dibujos repetidos.
- Cómo crear la pantalla de carga en libgdx?
- Desarrollo de juegos Android 2D sin motor
- Android: efecto curl de página como iphone
- OpenGL ES 2.0 Error al asignar correctamente el atributo de color
- La textura de OpenGL no sigue la geometría
Esto funciona bien en esta aplicación – hasta que empiece a girar el Bitmap
de Bitmap
subyacente para compensar la rotación del dispositivo, apoyando la capacidad de "acercar" la superficie de dibujo y, por lo tanto, tener que escalar el Bitmap
subyacente, etc. Girado y el dibujo escalado, cuando el usuario está dibujando, tenemos que escalar y girar nuestro mapa de bits en onDraw (), y esto es absolutamente rastreo.
He mirado un SurfaceView
, pero como esto todavía utiliza el mismo mecanismo de Canvas
, no estoy seguro de que voy a ver una mejora notable … por lo que mis pensamientos a su vez a OpenGL. He leído en alguna parte que OpenGL puede hacer rotaciones y escalar esencialmente "de forma gratuita", e incluso vio rumores (tercer comentario) de que Canvas
podría estar desapareciendo en futuras versiones.
En esencia, estoy un poco atrapado entre las soluciones de Canvas
y OpenGL … Tengo una aplicación de dibujo en 2D que parece encajar perfectamente con el modelo de Canvas
cuando en un estado, ya que no hay constantes re-dibujos pasando como un juego Ejemplo cuando el usuario no está dibujando no necesito ningún re-dibujo), pero cuando el usuario ES dibujo, necesito el máximo rendimiento necesario para hacer algunas cosas cada vez más complejas con la superficie …
Sería bienvenido cualquier pensamiento, punteros y sugerencias.
- Intercambiar píxeles de MainTex con otras texturas a través de la superficie Shader (Unity)
- Diferencia de OpenGL ES para iOS y Android
- La construcción de un visor de modelo 3d Android?
- Consejos sobre dibujo de alto rendimiento en Android
- Cómo acelerar la representación con OpenGL (ES) 2 Android
- ¿Cómo usar MediaMuxer / MediaCodec InputSurface con GLSurfaceView?
- Android TextureView sólo dibuja cuando OnSurfaceTextureUpdated se llama
- ¿El emulador de Android admite OpenGL ES 3.0?
OpenGL sería capaz de manejar las rotaciones y escalar fácilmente.
Honestamente, probablemente tendrás que aprender mucho de OpenGL para hacer esto, específicamente relacionado con los temas de:
- Geometría
- Iluminación (o simplemente desactivarla)
- Picking (seleccionando la geometría para dibujar en ella)
- Mapas de píxeles
- Mapeado de texturas
- Mipmapping
Además, aprender OpenGL para esto podría ser excesivo, y tendría que ser muy bueno en ello para hacerlo eficiente.
En su lugar, recomendaría usar los componentes gráficos de una biblioteca de juegos construida sobre openGL, como por ejemplo:
- Cocos2d
- Libgdx
- Cualquiera de los motores listados aquí
Tienes razón en que SurfaceView usa Canvas debajo de la capucha. La diferencia principal es que SurfaceView utiliza otro hilo para hacer el dibujo real, lo que generalmente mejora el rendimiento. Suena como que no le ayudaría mucho, sin embargo.
Usted está correcto que OpenGL puede hacer rotaciones muy rápidamente, así que si necesita más rendimiento es el camino a seguir. Probablemente debería usar GLSurfaceView. El principal inconveniente con el uso de OpenGL es que es un verdadero dolor para hacer el texto. Básicamente usted tiene que (bien, no tiene que, pero parece ser la mejor opción) hacer bitmaps de texto.
Bueno, esta pregunta fue hecha hace 6 años. Tal vez Android 4.0 no ha surgido? En realidad, después de Android 4.0 el Canvas en android.view.View es un lienzo acelerado por hardware, lo que significa que es implementado por OpenGL, por lo que no es necesario utilizar otra forma de rendimiento.
Puede ver el https://github.com/ChillingVan/android-openGL-canvas/blob/master/canvasglsample/src/main/java/com/chillingvan/canvasglsample/comparePerformance/ComparePerformanceActivity.java para comparar el rendimiento del lienzo normal En vista con GLSurfaceView.
- Establecer la imagen del url a la vista de la imagen
- No se puede utilizar Fragment.setRetainInstance () como un reemplazo para Activity.onRetainNonConfigurationInstance ()