:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Forums Hébergés :: > OldSchool Library > Aide au développement

Aide au développement Aide sur l'utilisation d'OSLib

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 03/09/2009, 22h18   #1
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut Problème de désallocation de mémoire linéaire

Bon alors voilà ce que je fais:

- je charge une grosse image (plus de 512x512)
- ensuite je créer plein de petites images et je recopie les pixels pour ainsi obtenir des frames de ma grosse image
- et j'affiche ces frames

Le problème c'est que je désalloue les images, je libère bien la ram normale mais la ram linéaire ne remonte pas, résultat un beau plantage un peu plus loin dans mon code vu qu'OSLib n'arrive plus à allouer de mémoire.

Voilà le résultat de test que j'ai obtenu via la fonction oslGetRamStatus():

RAM DE DEPART: ~14 Mo
La première ligne correspond à la mémoire normale libre.
La deuxième ligne correspond à la mémoire linéaire libre.

APRES CHARGEMENT GROSSE IMAGE
7 577 308
5 633 804

APRES CHARGEMENT DES FRAMES
641 616
446 444

APRES LIBERATION GROSSE IMAGE
6 900 416
6 284 924

DIVERS TRAITEMENTS ET AUTRES ALLOCATIONS PLUS LIGHT

APRES LIBERATION FRAMES
14 098 176
6 090 892

Si quelqu'un avait une idée ce serait cool, car j'ai essayé pas mal de chose et j'arrive jamais à récupérer la mémoire linéaire...

Merci d'avance
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]

Dernière modification par Dr.Vince ; 10/09/2009 à 22h25.
Dr.Vince est déconnecté   Réponse avec citation

Publicité

Vieux 09/09/2009, 15h07   #2
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Je ne pense pas pouvoir t'aider beaucoup, je peux juste te dire que j'ai galéré à mort pour résoudre des problèmes de mémoire, qui provenaient d'endroits invraisemblables...
Genre:
- charger un son en .bgm puis le libérer = mini fuite mémoire (http://playeradvance.org/forum/showp...36&postcount=1)
- utiliser ostringstream = allocation permanente d'un peu de mémoire et perte de toutes les allocs précédentes... j'ai ajouté ca au démarrage de mon jeu et hop c'etait nickel:
Code PHP:
//weird initialization of iostreams :( needed or else program will crash when arena is >10 000 000
ostringstream ost;
ost.setf(ios::fixed,ios::floatfield);
ost.precision(2);
ost << 15.0256f
J'ai trouvé ca en me basant sur cet article:
http://scaryreasoner.wordpress.com/2...with-mallinfo/

Si t'arrives a poster un peu de code minimal qui fuit je le lirai.

Et quand tu dis mémoire linéaire tu parles de la VRAM?
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation
Vieux 09/09/2009, 15h22   #3
Foxy
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 366
Par défaut

L'eternel probleme de la fragmentation memoire. On y est souvent confronté sur les machines qui ne supportent pas l'adressage virtuel.
Le seul moyen d'éviter ca est de creer ton propre gestionnaire de memoire et ainsi pouvoir recompacter les blocs memoires apres une desallocation.
__________________
Mes releases persos, etc...
Foxy est déconnecté   Réponse avec citation
Vieux 09/09/2009, 15h34   #4
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

Au passage je fait du C++, donc je sais pas si ça peut avoir un impact.

@Foxy: ouais mais là ça va pas être possible ça.
Mais si je comprend ce que tu veux dire, les blocs sont désalloués mais le gestionnaire ne voit pas qu'il sont les uns à côté des autres c'est ça ?
Le gestionnaire dont tu parle, il est lié au compilateur et au sdk que j'utilise ?


@daaa57150: bah en fait je pense que la mémoire linéaire ce sont des blocs les uns à côté des autres.
J'ai employé ce terme car c'est celui utilisé par la méthode oslGetRamStatus(), mais après je sais pas exactement à quoi ça correspond, seul Brunni pourrait nous réponde.

Pour le code, je peux pas te le fournir car en gros faudrait tout le projet car le truc est un peu complexe. Mais voilà le bout de code qui fait la manip:

Code PHP:

/* Déclaration dans le .hpp: */

OSL_IMAGE** images;

/* Contenu du .cpp */

//=====================================================================
// Constructueur
//=====================================================================
DisplayObjectSprite::DisplayObjectSprite(char *filenameDisplayObject::SpriteSheetOrientation orientationint frameWidthint frameHeightint offsetXint offsetYint nbFramesint xint y) : DisplayObject(0,0) {
    
OSL_IMAGEtmp oslLoadImageFilePNG(filenameOSL_IN_RAMOSL_PF_8888);
    
this->orientation orientation;
    
this->frameWidth frameWidth;
    
this->frameHeight frameHeight ;
    
this->nbFrames nbFrames;
    
this->offsetX offsetX;
    
this->offsetY offsetY;
    
this->zoomX frameWidth;
    
this->zoomY frameHeight;

        
// allocation du tableau des frames
    
images = new OSL_IMAGE*[nbFrames];
        
// découpage de la grosse image en plusieurs frames
    
for(int i=i<nbFrames i++){
        if(
orientation == HORIZONTAL){
            
images[i] = copyImage(tmpoffsetX+(i*frameWidth), offsetYframeWidthframeHeight);
        }
        else{
            
images[i] = copyImage(tmpoffsetXoffsetY+(i*frameHeight), frameWidthframeHeight);
        }
    }
    
oslDeleteImage(tmp);
}

//=====================================================================
// Desctructeur
//=====================================================================
DisplayObjectSprite::~DisplayObjectSprite(){
        
// désallocation de chaque frame
    
for(int i=i<this->nbFrames i++){
        
oslDeleteImage(images[i]);
    }
        
// désallocation du tableau des frames
    
delete [] images;
}

//===============================================================
// Recopie une partie de la grosse image dans une petite image
//===============================================================
OSL_IMAGEDisplayObject::copyImage(OSL_IMAGEimageint xint yint widthint height){
    
int i,j;

    
OSL_IMAGEnewImage oslCreateImage(widthheightOSL_IN_RAMimage->pixelFormat);
    
oslClearImage(newImage,RGBA(0,0,0,255));
    for(
i=i<width i++){
        for(
j=j<height j++){
            
OSL_COLOR pixel oslGetImagePixel(imagei+xj+y);
            
oslSetImagePixel(newImageijpixel);
        }
    }

    return 
newImage;

__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 09/09/2009, 15h59   #5
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Je ne vois rien qui pourrait engendrer une perte réelle de mémoire, de la fragmentation oui très certainement si tu crées beaucoup de DisplayObjectSprite.

Essaie déjà de changer ca:
OSL_IMAGE* tmp = oslLoadImageFilePNG(filename, OSL_IN_RAM, OSL_PF_8888);
en ca:
OSL_IMAGE* tmp = oslLoadImageFilePNG(filename, OSL_IN_VRAM, OSL_PF_8888);
Vu que tu vas l'effacer direct c'est pas grave de la mettre en VRAM, et surtout ca va pas faire de "trou" dans la mémoire RAM. La VRAM est très petite cela dit, je sais plus exactement mais faut faire gaffe si tu y mets une image énorme. Et maintenant que j'y pense, on peut charger une image + grande que 512x512? Je croyais que c'était une limite technique?

Sinon une bonne pratique je pense c'est d'utiliser les locks d'oslib sur les images quand on les manipule (surement aucun rapport avec ton problème mais bon..); dans ta fonction de copie:
Code PHP:
OSL_IMAGEDisplayObject::copyImage(OSL_IMAGEimageint xint yint widthint height){
    
int i,j;

    
OSL_IMAGEnewImage oslCreateImage(widthheightOSL_IN_RAMimage->pixelFormat);

    
oslLockImage(image);
    
oslLockImage(newImage);

    
oslClearImage(newImage,RGBA(0,0,0,255));
    for(
i=i<width i++){
        for(
j=j<height j++){
            
OSL_COLOR pixel oslGetImagePixel(imagei+xj+y);
            
oslSetImagePixel(newImageijpixel);
        }
    }

    
oslUnlockImage(newImage);
    
oslUnlockImage(image);

    return 
newImage;


Edit - trouvé dans la doc d'oslib:
Important: The maximum size of an image is 512x512! None of the height or width can exceed 512 (for example 10x600 is invalid, 10x500 is okay).
__________________
Essayez mon dernier jeu sur iPhone:


Dernière modification par daaa57150 ; 09/09/2009 à 16h04.
daaa57150 est déconnecté   Réponse avec citation
Vieux 09/09/2009, 16h06   #6
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

alors je peux pas mettre en VRAM car mes frames ne sont pas supprimées tout de suite, justement je les charges toutes d'un coup et après j'ai un moteur qui se charge de l'affichage.

On peut charger des images plus grande que 512*512 mais pas les afficher

Pour les locks en vrai ils y sont car je pensais que ça venait de ça, mais la j'avais que le code source de mon SVN sous la main, donc pas mes dernières modifs
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 09/09/2009, 16h16   #7
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Tes frames oui mais pas la grosse image, celle la tu la degage une fois les copies faites. Donc la grosse va en vram et les petites en ram, comme ca, pas de trou.
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation
Vieux 09/09/2009, 16h25   #8
Foxy
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 366
Par défaut

Citation:
Envoyé par Dr.Vince Voir le message
@Foxy: ouais mais là ça va pas être possible ça.
Mais si je comprend ce que tu veux dire, les blocs sont désalloués mais le gestionnaire ne voit pas qu'il sont les uns à côté des autres c'est ça ?
Le gestionnaire dont tu parle, il est lié au compilateur et au sdk que j'utilise ?
je ne connais pas l'oslib, mais je suppose qu'elle utilise des new/delete, donc le gestionnaire memoire est celui de la lib standard du compilo.
Quoi qu'il en soit, mettre en place un gestionnaire de memoire n'est pas tres complexe, je crois que Brunni en a un tres bon exemple dans son gestionnaire VRam sur la uLib.
__________________
Mes releases persos, etc...
Foxy est déconnecté   Réponse avec citation
Vieux 09/09/2009, 16h25   #9
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

@daaa57150: ok, mais la grosse image je peux pas car elle est trop grosse (~7Mo)

@Foxy: OSLib est en C, mais je parlais du pspsdk
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 09/09/2009, 16h55   #10
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Dans ce cas

Tu peux pas couper ton image avant de l'intégrer à ton programme? Tu pourrais programmer un truc qui te découpe tes spritesheets et charger les images séparément, c'est ce que je fais pour mes animations, je les nomme monanim1.png, monanim2.png et en connaissant le nombre de frames tu peux charger dynamiquement. au moins y a pas la big allocation temporaire.
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation
Vieux 09/09/2009, 17h30   #11
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

ouais des solutions de contournement j'en ai quelques unes mais j'aurais préféré résoudre le problème.

perso, j'utilise la même technique que toi mais en transformant les images en code et en utilisant les virtualfiles, histoire de pas trop perdre de temps en chargement
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 09/09/2009, 21h16   #12
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Soit tu ne libères pas *vraiment tout* ce que tu as alloué soit l'implémentation de memory.c ne tente pas de consolider les blocs libres d'une façon optimale (ça me semble bizarre, mais je l'avais pas vraiment lue en détail; je voulais juste savoir le type d'implémentation dont il s'agissait).
Mais c'est clair que si tu as besoin d'un max de mémoire y a pas d'autre choix que faire de l'allocation statique (typiquement on le faisait presque toujours sur GBA).
Brunni est déconnecté   Réponse avec citation
Vieux 09/09/2009, 23h14   #13
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

En fait je crois que t'auras pas le choix, charger des images de 7 Mo c'est trop, il faut trop de mémoire contigüe. Avec des petites allocations partout ailleurs tu peux pas charger des si gros trucs. Si mes souvenirs sont bons, la PSP c'est 24Mo, avoir à disposition 7Mo contigües là dedans c'est chaud au bout d'un moment.
T'en charges beaucoup des comme ça?

S'il s'agit d'une grosse image contenant tous tes sprites et que tu fabriques plein de DisplayObject avec la même image en paramètre, tu devrais la charger à l'extérieur de ta fonction:
1) charger grosse image
2) créer tous les DisplayObject dépendants
3) libérer grosse image

Sinon pour la vitesse de chargement, moi je charge pour certains levels plus de 200 images pour mes sprites + les sons + les scripts + les traitements et ça prend pas plus de 3secondes, c'est plus qu'acceptable je trouve.
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation
Vieux 09/09/2009, 23h43   #14
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

ha, bah j'ai pas compris ce que tu me disais alors, moi j'en besoin de charger une partie de l'image à chaque frame de la psp, c'est pour ça que je l'ai embarqué dans la rom

sinon la grosse image c'est juste pour l'animation d'un titre, mon graphiste s'est un peu enflammé

sinon concernant mon problème, ça vient de mon code, car j'ai pris que les classes nécessaires et je me suis fait un petit projet, et là plus de problème donc ça doit clocher quelque part
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 09/09/2009, 23h52   #15
Ass-Itch
Graphiste / Modérateur
 
Date d'inscription: 05/09/2006
Localisation: Hossegor
Messages: 2 583
Voir les codes amis Wii
Par défaut

Citation:
Envoyé par Dr.Vince Voir le message
sinon la grosse image c'est juste pour l'animation d'un titre, mon graphiste s'est un peu enflammé
J'savais bien que tôt ou tard tu la sortirais celle-là Mea culpa
Ass-Itch est déconnecté   Réponse avec citation
Vieux 10/09/2009, 10h56   #16
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Citation:
Envoyé par Dr.Vince Voir le message
sinon la grosse image c'est juste pour l'animation d'un titre, mon graphiste s'est un peu enflammé
Quand même ouais
Passe la dans pngcrush pour voir

Citation:
Envoyé par Dr.Vince Voir le message
sinon concernant mon problème, ça vient de mon code, car j'ai pris que les classes nécessaires et je me suis fait un petit projet, et là plus de problème donc ça doit clocher quelque part
Bien possible alors. Bonne chance pour trouver d'où ça vient, pense à la technique "wolf fence" c'est en grande partie grâce à ça que j'ai trouvé mes fuites. Pour le reste j'ai écrit des classes pour compter les alloc/déalloc de mes objets, et par ci par là y'en a qui étaient pas libérés; c'est vite arrivé quand y'a beaucoup de code
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation
Vieux 10/09/2009, 13h56   #17
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

merci pour wolf lence j'essaierais de mettre ça en place.

merci aussi pour pngcrush je connaissais pas mais malheureusement il a pas réussit à me réduire le gfx.
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 10/09/2009, 14h02   #18
Yodajr
Administrateur
 
Date d'inscription: 09/11/2005
Messages: 3 750
Par défaut

ho sympa pngcrush, merci pour le lien
Yodajr est déconnecté   Réponse avec citation
Vieux 10/09/2009, 22h25   #19
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

c'est bon j'ai corrigé le problème. Il y avait dans mon moteur un endroit où j'avais oublié de désallouer un objet, par contre ça avait pas vraiment de rapport avec le code que j'ai posté, donc c'est assez bizarre m'enfin bon, du moment que c'est réglé

Merci à tous
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 10/09/2009, 23h39   #20
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Ha oui sorry j'ai pas été précis: tu dois désallouer tout pour que ça revienne à l'état initial. Mettons qu'à un moment tu as 7 Mo sur les 14 utilisés. Tu alloues un petit objet, il va venir au milieu. Puis tu continues d'allouer des images et autres, tu auras beau toutes les libérer, y compris les 7 Mo du début, si cet objet reste au milieu tu auras jamais plus de 7 Mo de mémoire linéaire libre...
Brunni est déconnecté   Réponse avec citation
Vieux 11/09/2009, 00h00   #21
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

ouais ça je m'en doutais, mais je comprenais pas comment ça pouvais arriver, et en cherchant en fait c'était à cause de mon putain d'écran de loading qui utilisait le code à fuite mémoire entre chaque chargement de ressource, d'où le problème de désallocation.
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Vieux 11/09/2009, 10h47   #22
daaa57150
Membre confirmé
 
Date d'inscription: 16/05/2007
Messages: 411
Voir l'identifiant PSN
Par défaut

Citation:
Envoyé par Brunni Voir le message
Ha oui sorry j'ai pas été précis: tu dois désallouer tout pour que ça revienne à l'état initial. Mettons qu'à un moment tu as 7 Mo sur les 14 utilisés. Tu alloues un petit objet, il va venir au milieu. Puis tu continues d'allouer des images et autres, tu auras beau toutes les libérer, y compris les 7 Mo du début, si cet objet reste au milieu tu auras jamais plus de 7 Mo de mémoire linéaire libre...
C'est ça que j'avais mis super longtemps à comprendre et qui m'a vachement fait ch***
C'est pour ca que les lazy-init de variables statiques sont à bannir sur la PSP, ce que fait très certainement std:: ostringstream et qui m'a fait tourner en bourrique si longtemps!

C'est quoi ce que tu nous concoctes au fait Dr.Vince? On peut savoir?
__________________
Essayez mon dernier jeu sur iPhone:

daaa57150 est déconnecté   Réponse avec citation
Vieux 11/09/2009, 11h17   #23
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 962
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

c'est dans ma signature et dans celle de Ass-Itch
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner]
Projet en cours: [Ne plus abandonner de projet...]
Dr.Vince est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
NDS Probléme d' adresse mémoire morok Aide au développement 5 24/06/2008 19h04
NDS EZ Flash V heaveN. Tests 41 13/02/2008 19h51
GBA Problème de gestion de la mémoire et des variables (débutant) Nesgba Aide au développement 3 25/05/2007 10h19
Probleme Lecteur Carte Memoire Beda Récréation 6 24/04/2006 18h39


Fuseau horaire GMT +2. Il est actuellement 19h40.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince