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

C++ Discussion :

Optimisation de mémoire / rapiditée


Sujet :

C++

  1. #1
    Membre éprouvé
    Optimisation de mémoire / rapiditée
    Bourjour a tous,

    Je éveloppe un jeux en 2D, donc une classe qui permet de recréer a partir d'un fichier texte un pointeur de surface qui est la map.
    Pour un peut plus de précision sur la structure :

    Fichiers :
    Dossier : Images de décores terrain
    Dossier : Images de décore superposer

    Donées:
    Enum : Liste des diférentes valeures (monstre/joueure/mure...)
    Classes/structures qui contiène l'équivalent des diférentes cases.

    Fichier texte qui contient la liste des composants.

    Donc pour mentenant venir au problème, il s'ofre a moi deux possibilitées :
    -Soit je charge le fichier, je créer un enchevètrement de structure, puis je créer la surface qui seras le décore, et je garde cette surface en mémoire, puis j'en ferais une copie sur laquel je rajouterais les personages ect....
    J'aurais donc deux surface en mémoire.
    -Soit je recréer a chaque afichage la surface a partir de la structure.
    J'aurais donc la structure en mémoire.

    J'aurais de nombreuses map, qui feron entre 100 et 1 000 carées de 32*32PX(1carée=1image, biensure on put en superposer plusieures)

    Qu'en penssez vous?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Expert éminent sénior
    Eh bien, je pense qu'en rapidité, précalculer la map active semble le mieux. par contre, tu ne pourras pas t'en servir pour faire des images de terrain (tiles) animées (il te faudra utiliser des images d'objets (sprites)).

    Question occupation mémoire, je suppose qu'une seul map est chargée à la fois:
    une carte de 1000 tiles 32*32 en profondeur de couleurs 24 bits: 3Mo environ. Je pense que sur un PC, 3/4 Mo de mémoire sont envisageables.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Enfaite je travaille en 32Bits, et il y auras surement de la superposition avec diférents alphas, donc tu me conseille de calculer le screen? C'est aussi ce que je pensais. Et au niveau du calcule, il vaut mieux calculer durant le chargement du fichier, de manière économiser la mémoire, ou charger le fichier sous la strucuture, générer la surface, puis détruire la structure?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Expert éminent sénior
    à mon avis, il te faudra garder la structure: Puisque c'est la structure qui décrit la map, c'est avec la structure que tu pourras détecter les collisions avec le décor.
    Donc pour moi, il vaut mieux précalculer l'image après avoir construit la structure, et garder les deux.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur

    Bonjour,

    Quel rapport avec le C++ ?
    Il y a sûrement un autre forum mieux adapté à ce type de question (qui est finalement indépendant du langage).

  6. #6
    Membre éprouvé
    Et bien le raport est que :
    1. Je développe en c++
    2. SDL, la librairie que j'utilise, est une librairie C

    Voila pourquoi j'ai pensser que poster ici était mieux aproprier.

    Sinon, donc il faudras que je garde les deux en mémoires? C'est vrai que je n'avais pas pensser au colisions.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  7. #7
    mat.M
    Invité(e)
    -Soit je charge le fichier, je créer un enchevètrement de structure, puis je créer la surface qui seras le décore, et je garde cette surface en mémoire, puis j'en ferais une copie sur laquel je rajouterais les personages ect....
    J'aurais donc deux surface en mémoire.
    -Soit je recréer a chaque afichage la surface a partir de la structure.
    J'aurais donc la structure en mémoire.
    La deuxième solution me paraît à éviter absolument car perte de fluidité d'affichage ( FPS )

    Il faut prendre la première solution.
    Il faut en fait initialiser un tableau qui mémorisera les positions en X et Y des "tuiles" du décor.
    Par exemple prendre une structure simple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct tuile{
    int X;
    int Y;
    bool PermettreCollision;
    }

    Un simple fread suffit pour l'initialiser.
    Le membre PermettreCollision peut prendre true si par exemple le carré de la tuile ( par ex 32X32 ) c'est de l'eau.
    Pour afficher les tuiles une simple boucle imbriquée où on balaie tous les X et tous les Y va afficher les tuiles

    Pour les tuiles du décor il est indispensable de développer parallèlement au moteur de jeu un éditeur pour dessiner ce décor .
    On peut rajouter une autre donnée membre qui retourne le numéro d'index représentant un "calque" ou "layer" pour donner des apparences multicouches.

  8. #8
    Membre éprouvé
    Enfaite, a la place d'une structure, j'ai une peutite classe, qui ressemble a ce que tu a dit avec en plus : "Le numéro de l'image[c'est bien bo une tuile mais si elle reste noire...]","Une methode qui Blit l'image sur un pointeur de surface". Une autre classe créer alors une liste d'objet de cette première classe, (en même temp que le fichier de map est lut) puis elle a come valeur : Nom + alpha(apliquer a toute la surface en coure) . Enfin, une torisième classe, créer une liste de cette deuxième classe en lisan le fichier. L'ordre de superposition dépend de l'ordre de la liste -> Donc l'ordre de lècture dans le fichier.

    Voila esque c'est bien adapter pour ce que je fait? Sinon, j'ai quelques problèmes avec la trnsparence et mes images(j'utilise SDL) :

    -J'ai des images BMP, comment mêttre de la trensparence dedan?(ou doije utiliser un autre format?)
    -Comment charger une autre image que un BMP sur une surface?
    -Comment Mêtre une transparence de X% sur une couleur donée dans une surface?
    -Comment changer la trensparence totale d'une surface?

    Pour mes "tuiles" : dois-je garder les images en mémoire dans l'aplication, ou les charger puis les détruires a chaque changement de map?

    Esque je devrais rajouter un Index pour chaquin de mes blocks pour savoir dans quel ordre les superposer? Et si c'est le cas, comment puije organiser ma liste(std::list) sur cette index?

    Pour l'éditeur/créateur de map, dois-je créer une nouvelle structure de classe séparer pour l'enregistrement, ou tout simplement ajouter des methodes a ma classe?



    Je sais sa fait bocoup de question, et ce n'est que le début ^^
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  9. #9
    Expert éminent sénior
    Eh bien pour ces questio, la plupart des réponses dépendent de la librairie utilisée.
    * Par exemple, un BMP n'a pas de transparence "en soi", mais tu as surement des fonctions qui permettent de spécifier qu'une des couleurs sera 100% transparente (comme TransparentBlt() avec WindowsGDI).
    * Pour charger une image non-bmp, cela dépend des formats supportés par la lib
    * La transparence avec % sur une couleur donnée, c'est assez rare... Généralement, on utilise directement des images 32 bits (rouge, vert, bleu, transparence)

    Bref, je ne peux pas t'en dire plus car je ne connais pas SDL, mais ce sont des généralités...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre éprouvé
    Oui, je me doute que c'est possible, car si sa ne l'avais pas était, des persones se serais emprèsser de développer de tel fontions ^^
    Mais la question est comment faire cela avec la SDL?

    Edit : Je vien d'opter pour la solution Lecture/Enregistrement dans la même classe. Les autres questions rèstent en suspend, et vien sajouter a la liste celle si :
    Quèl est selon vous la meilleur fasson de crypter&comprèsser mes fichier de map? Je voudrais en faite créer une fonction qui lit le fichier, le décrypter & décomprèsse(ZLIB?), et retourn un std::stringstream ou un std::string.
    Et je voudrais a l'inverse une fonction qui avec un std::stringstream crypte et enregistre. Pour sela il me faut utiliser des algorithme de comprèssion et cryptage, et je voudrais savoir si il y a des lib qui font sa facilement, et comment les utiliser?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

###raw>template_hook.ano_emploi###