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.

  • Android 2D-juego, la mejor opción para los gráficos?
  • Android - las últimas bibliotecas de código abierto en 3d para android
  • Parallax XY y cálculo de la rotación
  • Cómo utilizar la cámara con Android OpenGL ES para trabajar?
  • Opengl fondo transparente y Vista previa de cámara no les gusta texturing
  • Visualización de texto de desplazamiento en forma de carpintería en Android
  • Plataforma C ligera y ligera (OpenGL)
  • Procesamiento de vídeo en Android 3.x / Google TV / SDK: Marco de vídeo a SurfaceTexture / OpenGL / GLSL
  • Android Video Recording de la superficie de OpenGL (GLSURFACEVIEW)
  • Verificar si el punto está dentro de un cono en el espacio 3D
  • Error al intentar obtener Alraedy creado Surface y recibir EGLNativeWindowType ya conectado a otro error de API
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.