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

Langage Java Discussion :

Gestion de la memoire pour un petit jeu


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut Gestion de la memoire pour un petit jeu
    Salut,

    j'ai un petit jeu, faconné en scenes, ou chaque scene peut lancer une autre scene comportant ses propres images, backgrounds ...

    Mon probleme est que si une scene est appelée regulierement et que je la cree a chaque fois avec new, jai une erreur heap exception lorsque je depasse la taille globale allouee au heap Space (64Mo)

    y a une solution qui serait de faire un singleton, mais ca voudrait dire que si 100 scenes sont appelees au cours du jeu, on a 100 singletons et la possibilite de faire peter la JVM

    je souhaiterais plutot creer une scene lorsque necessaire, mais relacher toutes ses ressources lorsqu elle se termine ...
    j ai essaye mettre scene = null puis dappeler le GC juste apres, mais ca donne quedale.

    donc ma question cest, comment on gere cela ????

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Tu pourrais avoir un truc de ce genre :
    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
     
    public class SceneFactory {
    	private static HashMap<String,Scene> map = new HashMap<String,Scene>();
     
    	public static Scene getScene(String nom) {
    		Scene scene = map.get(nom);
    		if(scene == null) {
    			scene = new Scene();
    			map.add(scene);
    		}
    		return scene;
    	}
     
    	public static void release(String scene) {
    		map.remove(scene);
    	}
    }

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Appeler explicitement le GC est une très mauvaise idée, et ne prédit généralement rien de bon...

    Et plutôt que de mettre à null des variables, il est préférable de limiter leurs scopes au maximum (ex: ne pas utiliser un attribut static pour une variable locale, ...)


    Enfin plutôt que de tout définir en Singleton, ce dont je ne comprend pas vraiment l'intérêt, tu devrais plutôt passer par un système de cache qui ferait en sorte de ne pas charger plusieurs fois les mêmes objets, et de les partager... un peu comme indiqué par verbose.

    Sinon il faudrait connaitre un peu plus ton application et son fonctionnement (que contient une scene, etc...)

    a++

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par verbose Voir le message
    Tu pourrais avoir un truc de ce genre :
    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
     
    public class SceneFactory {
    	private static HashMap<String,Scene> map = new HashMap<String,Scene>();
     
    	public static Scene getScene(String nom) {
    		Scene scene = map.get(nom);
    		if(scene == null) {
    			scene = new Scene();
    			map.add(scene);
    		}
    		return scene;
    	}
     
    	public static void release(String scene) {
    		map.remove(scene);
    	}
    }
    j y avais pensé a ca oui

    testé a linstant sans succes, jappelle ma scene avec getScene(...) puis desuite apres je fais un release

    j ai límpression que la scene ne passe jamais dans le garbage collector, je comprends pas trop pourquoi

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par franck06 Voir le message
    j ai límpression que la scene ne passe jamais dans le garbage collector, je comprends pas trop pourquoi
    On pourrait voir le code que tu as utilisé ??? Et comment tu fais pour affirmer que le GC ne passe pas ?

    Sinon je rappelle que le GC ne s'exécute pas aussitôt mais regroupe les libérations...



    Sinon verbose, une remarque que je viens de voir sur ton code : il n'est pas thread-safe et donc potentiellement dangereux dans un environnement multi-thread.

    Comme on ne peut pas garantir qu'un élément static ne soit utilisable que d'un seul thread, il faudrait synchronisé tout cela, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static Map<String,Scene> map = Collections.synchronizedMap(new HashMap<String,Scene>());
    a++

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Appeler explicitement le GC est une très mauvaise idée, et ne prédit généralement rien de bon...

    Et plutôt que de mettre à null des variables, il est préférable de limiter leurs scopes au maximum (ex: ne pas utiliser un attribut static pour une variable locale, ...)


    Enfin plutôt que de tout définir en Singleton, ce dont je ne comprend pas vraiment l'intérêt, tu devrais plutôt passer par un système de cache qui ferait en sorte de ne pas charger plusieurs fois les mêmes objets, et de les partager... un peu comme indiqué par verbose.

    Sinon il faudrait connaitre un peu plus ton application et son fonctionnement (que contient une scene, etc...)

    a++
    les scenes globalement contiennent une image de fond, des personnages animees (donc des images Png pour chacun), et le plus lourd, une map de Tiles qui est chargee via un tableau d'int (tableau de 5000 int) depuis un fichier txt
    la map de tiles sappuie sur une image png pour etre creee, decoupee elle meme en petites images stockees

    il est possible de ne charger les images des personnages qu une seule fois pour la scene, par contre, la TileMap varie en fnction du Level on va dire, donc le tableau est recharge a chaque Level chargé

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    On pourrait voir le code que tu as utilisé ??? Et comment tu fais pour affirmer que le GC ne passe pas ?

    Sinon je rappelle que le GC ne s'exécute pas aussitôt mais regroupe les libérations...



    Sinon verbose, une remarque que je viens de voir sur ton code : il n'est pas thread-safe et donc potentiellement dangereux dans un environnement multi-thread.

    Comme on ne peut pas garantir qu'un élément static ne soit utilisable que d'un seul thread, il faudrait synchronisé tout cela, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static Map<String,Scene> map = Collections.synchronizedMap(new HashMap<String,Scene>());
    a++
    effectivement mais c'est monothread donc pas de pb ...

    pour le code :

    grosso modo disons que j'ai une scene principale qui appelle un jeu (genre un Mario classique) comportant differents Levels

    dans la scene principale, j appelle le jeu de la facon suivante :

    JadeScene scene = miniGameFactory.getScene(display, "mario"); display.start(scene);
    miniGameFactory.release("mario");

    selon ou lon se trouve dans la scene principale, on charge un level different du Mario classique (un peu comme le vrai jeu on va dire)

    ici, le Level chargé est en permanence le meme, mais bon, la taille du Heap devrait pas exploser ...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    On pourrait voir le code que tu as utilisé ??? Et comment tu fais pour affirmer que le GC ne passe pas ?

    Sinon je rappelle que le GC ne s'exécute pas aussitôt mais regroupe les libérations...



    Sinon verbose, une remarque que je viens de voir sur ton code : il n'est pas thread-safe et donc potentiellement dangereux dans un environnement multi-thread.

    Comme on ne peut pas garantir qu'un élément static ne soit utilisable que d'un seul thread, il faudrait synchronisé tout cela, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static Map<String,Scene> map = Collections.synchronizedMap(new HashMap<String,Scene>());
    a++

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JadeScene scene = miniGameFactory.getScene(display, "mario");		display.start(scene);
    miniGameFactory.release("mario");
    Oui mais que devient scene ?
    Si elle est toujours référencé le GC ne pourra pas la libérer...


    a++

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JadeScene scene = miniGameFactory.getScene(display, "mario");		display.start(scene);
    miniGameFactory.release("mario");
    Oui mais que devient scene ?
    Si elle est toujours référencé le GC ne pourra pas la libérer...


    a++
    dans mon code, scene n'est referencee qu ici
    cela dit, j utilise une petite librairie 2D qui se charge de stopper demarrer une scene
    il est possible peut etre que les scenes soient referencees ailleurs alors
    je vais regarder le code de la lib pour voir

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par franck06 Voir le message
    dans mon code, scene n'est referencee qu ici
    cela dit, j utilise une petite librairie 2D qui se charge de stopper demarrer une scene
    il est possible peut etre que les scenes soient referencees ailleurs alors
    je vais regarder le code de la lib pour voir
    ok, la librairie ne reference pas les scenes
    on dispose d un display qui joue une scene grosso modo, le start du display ca donne en gros :

    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
     public final void start(Scene scene)
        {
            if(running)
                throw new Error("Engine already running !");
            scene.begin();
            running = true;
           ...
            while(running) 
            {            
                scene.mainLoop();
              ....
     
            }
            running = false;
            scene.end();        
        }
    pour arreter une scene, il suffit alors de faire display.stop() qui set running a false et permet de sortir de la boucle ...


    mystere, la je sais plus que faire

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Et l'objet display ? Tu es sûr qu'il est unique ? Son instance n'est pas conservée quelque part ?
    Tu confirmes bien qu'il n'y a aucun Thread démarré dans une Scene ?

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Et l'objet display ? Tu es sûr qu'il est unique ? Son instance n'est pas conservée quelque part ?
    Tu confirmes bien qu'il n'y a aucun Thread démarré dans une Scene ?
    Aie

    le display est cree dans la scene initial, mais ensuite, on le passe de Scene en Scene, donc on en garde une reference dans chaque scene

    ca veut il dire que tant que display n'est pas null, chaque scene le reference et sera vivante en quelque sorte ??

  14. #14
    Membre actif

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Points : 220
    Points
    220
    Par défaut
    Tant qu'une référence au moins existe sur un objet, le GC ne fera pas le ménage.

    Le GC compte le nombre de référence associé à un objet lorsque ce nombre est égal à 0 il nettoie.

  15. #15
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Vivian Pennel Voir le message
    Tant qu'une référence au moins existe sur un objet, le GC ne fera pas le ménage.

    Le GC compte le nombre de référence associée à un objet lorsque ce nombre est égal à 0 il nettoie.
    Exact.

    De plus, le fait de conserver une instance de Display dans une Scene n'influence pas la suppression de la Scene par le GC.
    Une Scene fait-elle des accès à un base de données ?

  16. #16
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Exact.

    De plus, le fait de conserver une instance de Display dans une Scene n'influence pas la suppression de la Scene par le GC.
    Une Scene fait-elle des accès à un base de données ?
    non aucun acces en base

    donc si je mets le Display en variable public static dans la scene principale et que jutilise cette varaible depuis les autres scenes, cest miuex ???

Discussions similaires

  1. Quelle techno pour un petit jeu ?
    Par DotNET74 dans le forum Windows Phone
    Réponses: 9
    Dernier message: 24/08/2011, 20h26
  2. Réponses: 0
    Dernier message: 22/03/2010, 09h41
  3. Réponses: 5
    Dernier message: 10/08/2009, 14h08
  4. Le langage C pour un petit jeu vidéo ?
    Par Darkthief dans le forum Développement 2D, 3D et Jeux
    Réponses: 15
    Dernier message: 06/04/2007, 13h42
  5. Besoin conseil pour un petit jeu
    Par Cosmosis dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2006, 14h44

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