Dibujar mapa de bits utilizando Opengl es en Android
Tengo una aplicación de Android que está dibujando una imagen de 800 * 480 en la pantalla. Mi teléfono también es 800 * 480 px. El teléfono es capaz de hacer el dibujo en unos 25 ms. Cada pocos segundos quiero pasar a otra imagen que también es de 800 * 480 por el desvanecimiento de la alfa de la primera imagen y el aumento de la alfa de la segunda imagen. Mientras que hace esto la llamada drawable.draw (lona) tarda cerca de 75 ms.
¿Qué puedo hacer para reducir el tiempo de dibujo durante la fase de transición? He considerado el uso de OPENGL, pero no puedo entenderlo.
- Previsualización y procesamiento simultáneo de la cámara
- Cómo utilizar OpenGL ES 2.0 en Android SDK (no NDK)?
- OpenGL ES - textura mapa todas las caras de un cubo de 8 vértices?
- GLSurfaceView: ¿Necesito llamar a onPause / onResume?
- Extensiones OpenGL disponibles en diferentes dispositivos Android
- Coordenadas de textura en opengl android mostrando la imagen invertida
- Programación de juegos Android 2D: ¿usando OpenGL o no?
- ¿Es posible renderizar una Vista de Android a una FBO o textura de OpenGL?
- Reduzca el uso de memoria para texturas en OpenGL ES 1.1
- Android: GLES20: Se llama API OpenGL ES no implementada
- Procesamiento de imágenes Android OpenGL - sin SurfaceView
- ¿Hacer una animación a pantalla completa en Android? ¿Debo usar OPENGL?
- Android: Decidir entre SurfaceView y OpenGL (GLSurfaceView)
Tuve el mismo problema y encontré mi rendimiento en opengl. Este tutorial me inició: http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/
Aquí está un ejemplo simple con OpenGL ES 1.0/1.1
y textura para dibujar bitmap a GLSurfaceView
.
private static class BitmapRenderer implements GLSurfaceView.Renderer { private int[] textures; private Resources resources; public BitmapRenderer(Resources resources) { this.resources = resources; } private static final float[] VERTEX_COORDINATES = new float[] { -1.0f, +1.0f, 0.0f, +1.0f, +1.0f, 0.0f, -1.0f, -1.0f, 0.0f, +1.0f, -1.0f, 0.0f }; private static final float[] TEXTURE_COORDINATES = new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; private static final Buffer TEXCOORD_BUFFER = ByteBuffer.allocateDirect(TEXTURE_COORDINATES.length * 4) .order(ByteOrder.nativeOrder()).asFloatBuffer().put(TEXTURE_COORDINATES).rewind(); private static final Buffer VERTEX_BUFFER = ByteBuffer.allocateDirect(VERTEX_COORDINATES.length * 4) .order(ByteOrder.nativeOrder()).asFloatBuffer().put(VERTEX_COORDINATES).rewind(); @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { textures = new int[1]; gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glGenTextures(1, textures, 0); gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher), 0); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { gl.glActiveTexture(GL10.GL_TEXTURE0); gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VERTEX_BUFFER); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TEXCOORD_BUFFER); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); } }
A continuación, sólo tiene que utilizar este GLSurfaceView
en su GLSurfaceView
glSurfaceView.setEGLContextClientVersion(1); glSurfaceView.setRenderer(new BitmapRenderer(getResources())); glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
Espero que sea útil.
- Mi aplicación se bloquea, ¿cómo implementar Threads en ella?
- ¿Cómo usar SQLite de Servicios en Android?