J'essaie d'activer l'accélération hw dans Honeycomb et d'afficher des bitmaps sur Canvas. Tout fonctionne bien, mais pour les grands bitmaps (> 2048 dans une dimension), j'obtiens une erreur dans le journal:
OpenGLRenderer: Bitmap trop grand pour être téléchargé dans une texture
Je sais que cela est dû à la limitation hw, et peut contourner cela en réduisant la taille maximale du bitmap à afficher si l'accélération hw est activée (vérification par View.isHardwareAccelerated ()).
Ma question est: comment déterminer facilement la taille de texture maximale disponible pour le dessin Bitmap par le matériel. 2048 semble être limité sur mon appareil, mais il peut être différent sur différents appareils.
Edit: je ne crée pas d'application OpenGL, juste une application normale, qui peut utiliser l'accélération hw. Ainsi, je ne connais pas du tout OpenGL, je vois juste une erreur liée à OpenGL dans le journal et cherche à le résoudre.
Actuellement, la limite minimale est de 2048 pixels (c'est-à-dire que le matériel doit prend en charge les textures au moins 2048x2048.) Dans ICS nous allons introduire une nouvelle API sur la classe Canvas qui vous donnera cette information:Canvas.getMaximumBitmapWidth()
et Canvas.getMaximumBitmapHeight()
.
Une autre façon d'obtenir la taille maximale autorisée serait de parcourir toutes les configurations EGL10 et de garder une trace de la plus grande taille.
public static int getMaxTextureSize() {
// Safe minimum default size
final int IMAGE_MAX_BITMAP_DIMENSION = 2048;
// Get EGL Display
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
// Initialise
int[] version = new int[2];
egl.eglInitialize(display, version);
// Query total number of configurations
int[] totalConfigurations = new int[1];
egl.eglGetConfigs(display, null, 0, totalConfigurations);
// Query actual list configurations
EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);
int[] textureSize = new int[1];
int maximumTextureSize = 0;
// Iterate through all the configurations to located the maximum texture size
for (int i = 0; i < totalConfigurations[0]; i++) {
// Only need to check for width since opengl textures are always squared
egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize);
// Keep track of the maximum texture size
if (maximumTextureSize < textureSize[0])
maximumTextureSize = textureSize[0];
}
// Release
egl.eglTerminate(display);
// Return largest texture size found, or default
return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION);
}
D'après mes tests, c'est assez fiable et ne vous oblige pas à créer une instance. En termes de performances, cela a pris 18 millisecondes pour s'exécuter sur mon Note 2 et seulement 4 millisecondes sur mon G3.
Si vous voulez connaître dynamiquement la taille limite de texture de votre appareil (car elle change en fonction de l'appareil), vous devez appeler cette méthode:
int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
Et n'oubliez pas que pour certains appareils (le Nexus One par exemple), la taille de texture doit être une puissance de 2!
Je sais que ma réponse arrive longtemps après la dernière mise à jour de ce sujet ... désolé
Selon la spécification, appeler glGetIntegerv
avec GL_MAX_TEXTURE_SIZE
.
GL_MAX_TEXTURE_SIZE params renvoie une valeur. La valeur donne une estimation approximative de la plus grande texture que le GL peut gérer. La valeur doit être au moins 64.
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml