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.

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.

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.

  • LibGDX y ObjLoader no muestran .mtl?
  • OpenGL ES 2.0 vs OpenGL 3 - Similitudes y diferencias
  • ¿Es posible usar pixmaps en Android a través de Java API para GLES?
  • Android: aplica efectos de OpenGL a la cámara
  • Señal 11 (SIGSEGV), código 1 (SEGV_MAPERR)
  • ¿El emulador de Android admite OpenGL ES 3.0?
  • Cómo hacer una cámara personalizada con Live Stickers
  • Cómo configurar el color de fondo en Open GL ES Android
  • Está llamando libgdx SpriteBatch método de inicio y fin varias veces caro?
  • La función Allocation.getSurface () de RenderScript siempre se queja de "llamada a OpenGL ES API sin contexto actual"
  • Fuente de luz dentro de una habitación que actúa inesperadamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.