IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Singleton et texture manager


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut Singleton et texture manager
    Bonsoir,

    Je veux créer un texture manager pour mon application. Mon problème est le suivant: avant de pouvoir utiliser ses fonctionnalités, il faut que je récupère le context de l'Activity, et le contexte opengl GL10.

    Mais là, problème, le Context n'est dispo que dans l'activité principale, et le contexte opengl uniquement dans le renderer..

    Donc je ne vois pas comment je peux initialiser mon textureManager..

    Pour palier le problème que le constructeur du singleton est nécessairement sans paramètre, j'ai créé une fonction init, mais déjà ça me pose un problème: on peut utiliser le manager alors même qu'il n'a pas encore été correctement initialisé... J'ai essayé de limiter un peu les dégâts avec une IOExceptions, mais bon...

    Une solution serait de faire 2 fonctions init, une qui prend le context en paramètre, qui sera appelée depuis l'Activity, et une qui prend le context gl, appelée depuis le renderer..

    Mais c'est sale, je perd le contrôle que me donnais l'aspect singleton vu que je peux utiliser le manager alors qu'il ne peut pas fonctionner...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    package org.plissken.texture;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
     
    import javax.microedition.khronos.opengles.GL10;
     
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.opengl.GLUtils;
     
    public class TextureManager {
    	private static TextureManager instance = null;
    	private static Context context;
    	private static HashMap<String, Integer> texList;
    	private static int[] texId;
    	private static int currentId;
     
    	private TextureManager(){
    		texList = new HashMap<String, Integer>();
    	}
     
    	public static void init(Context c, GL10 gl, int maxTex){
    		context = c;
    		texId = new int[maxTex];
    		gl.glGenTextures(maxTex, texId, 0);
    	}
     
    	public final synchronized static TextureManager getInstance(){
    		if(instance == null)
    			instance = new TextureManager();
    		return instance;
    	}
     
    	public int getTextureByName(String name) throws IOException{
    		if(!texList.containsKey(name)){
    			//Not found, try to load it
    			InputStream is = null;
     
    			if(context == null){
    				throw new IOException();
    			}
     
    			try {
    				is = context.getAssets().open("textures/"+name);
    				Bitmap bitmap;
    				bitmap = BitmapFactory.decodeStream(is);
    				GLUtils.texImage2D(GL10.GL_TEXTURE_2D, ++currentId, bitmap, 0);
    				bitmap.recycle();
     
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			//Save it
    			texList.put(name, currentId);
     
    			return currentId;
    		}else{
    			return texList.get(name);
    		}
    	}
    }
    Merci d'avance pour vos idées..

    @+
    Seeme

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    T'as essayé de prendre le problème dans le sens inverse ?
    C'est à dire, une instance de ton TextureManager dans ta classe principale / moteur graphique. Et lors de l'initialisation de chaque objet, passer en paramètre la texture dans le constructeur, texture que tu ara pioché dans le TextureManager.

  3. #3
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Bonjour,

    Je ne suis pas sûr de comprendre.

    Le truc c'est que comme le textureManager est statique normalement je peux taper dedans de n'importe où, un peu comme une variable globale...

    Si je garde cette instance dans l'activity principale, il y a deux problèmes: je perd l'intérêt du singleton, vu que je me retrouve a passer le manager dans tous les constructeurs (et ce serait le même problème si j'ai 10 managers différents pour le réseau, le son, etc, j'aurais des kilos de paramètres..).

    En plus, je ne peux pas construire l'objet dans l'Activity, vu que je n'ai pas accès au contexte GL10...

    C'est pas la première fois que je me retrouve coincé comme ça sous android... C'est assez frustrant.

    Si je fais la comparaison par exemple avec le C++, le système de fichier est accessible partout, idem pour le contexte ogl...

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/10/2011, 14h40
  2. [Managed] Peindre dans une texture
    Par themadmax dans le forum DirectX
    Réponses: 3
    Dernier message: 16/08/2007, 16h44
  3. Chargement d'une texture a partir de la mémoire
    Par logramme dans le forum DirectX
    Réponses: 6
    Dernier message: 27/01/2003, 14h57
  4. Mosaïque texturée
    Par Pode dans le forum OpenGL
    Réponses: 5
    Dernier message: 19/09/2002, 09h50
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo