:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Aide au développement

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 09/02/2013, 16h22   #1
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut [RÉSOLU] Aide pour fonction foireuse

Hello !
J'ai une fonction comme suit:

Code PHP:
charFatLoad(char *filename) {
        
FILEFile fopen (filename"rb");
        if(
File)// Make sure there is a file to load
        
{
 
                
u32 Size;
                
fseek (FileSEEK_END);
                
Size ftell (File);
                
rewind (File);
                
//char * buffer;
                
char buffer=NULL;
                
buffer = (char*) malloc (sizeof(char)*Size);
                if(
buffer!=NULL){
                        
fread (buffer1SizeFile);
 
                        
fclose (File);
                        return 
buffer;
                }
                else {
//if this happens you're out of memory!
                        
fclose (File);
                        return 
0;
                }
        }
        return 
0;

Je l'utilise par cet appel par exemple:

Code PHP:
            char TempName[256];
        
sprintf(TempName,"/img/%s_Tiles.bin",name);
        
char *Tiles FatLoad(TempName); 
Le souci, c'est que le malloc me bouffe au fur et à mesure la RAM, et que le jeu fini par planter au bout du chargement d'environ 30 pièces de jeu.

J'ai trouvé cette fonction je sais plus où, et comme je suis pas à l'aide avec les malloc .... si quelqu'un sait comment modifier le bouzin pour que ça libère la mémoire. Faut utiliser free d'après ce que je sais, mais où et comment ? J'ai pas réussi ....

Thanks

Dernière modification par Ninnin ; 13/02/2013 à 13h30.
Ninnin est déconnecté   Réponse avec citation

Publicité

Vieux 09/02/2013, 18h03   #2
Tiwaz
Newser
 
Date d'inscription: 18/03/2007
Localisation: Un coin trop froid...
Messages: 739
Par défaut

Rien de choquant avec cette fonction.

Il est normal que plus tu charges de mémoire, moins il y ait de mémoire disponible. Sur DS, tu n'as que 4Mo de disponible en théorie, et en pratique, beaucoup moins (diverses lib, ...).
Si tu charges des sprites, c'est normal que ca finisse par te prendre toute ta mémoire.

Il serait plus intéressant de nous dire exactement ce que tu tentes de faire pour qu'on puisse t'aiguiller sur une solution moins onéreuse en RAM

Dans le morceau de code montré, tu ne peux pas libérer la mémoire, puisque c'est à la ressource qui reçoit le buffer de s'en occuper, et j'espère qu'elle fait quelque chose avec ses données.

Par contre, je suis étonné que tu bloques à 30 tiles.
__________________
Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils, ça ce sont les attributs de la magie.
Tiwaz est déconnecté   Réponse avec citation
Vieux 09/02/2013, 18h11   #3
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

C'est pas 30 tiles, c'est 30 pièces dans le jeu, le jeu étant découpé en pièces.
J'utilise cette fonction pour charger des images LargeMap qui sont en efs. Je ne cherche pas de solution moins gourmande en ram, celle là me convient très bien.
Il y a juste que la mémoire n'est pas free après utilisation, donc de pièce en pièce au fur et à mesure de l'exploration dans le jeu, ça sature.

Je sais qu'il existe des solution pour charger des maps, sauf que je charge des maps de 9128 * 9128 en général pour les + petites. Aucune fonction de base de la PALib ne fait ça, surtout que je dois y toucher derrière... BREF !

Comment faire ce free de mémoire, ou comment renvoyer le contenu de mes fichier *_Tiles, *_Map et *_Pal sans bouffer toute la mémoire dans le temps ?
Ninnin est déconnecté   Réponse avec citation
Vieux 10/02/2013, 14h11   #4
Tiwaz
Newser
 
Date d'inscription: 18/03/2007
Localisation: Un coin trop froid...
Messages: 739
Par défaut

Citation:
Envoyé par Ninnin Voir le message
C'est pas 30 tiles, c'est 30 pièces dans le jeu, le jeu étant découpé en pièces.
J'utilise cette fonction pour charger des images LargeMap qui sont en efs. Je ne cherche pas de solution moins gourmande en ram, celle là me convient très bien.
Il y a juste que la mémoire n'est pas free après utilisation, donc de pièce en pièce au fur et à mesure de l'exploration dans le jeu, ça sature.

Je sais qu'il existe des solution pour charger des maps, sauf que je charge des maps de 9128 * 9128 en général pour les + petites. Aucune fonction de base de la PALib ne fait ça, surtout que je dois y toucher derrière... BREF !

Comment faire ce free de mémoire, ou comment renvoyer le contenu de mes fichier *_Tiles, *_Map et *_Pal sans bouffer toute la mémoire dans le temps ?
Ce que j'essais de t'expliquer, c'est que tu ne les "bouffes" pas. Cette mémoire, c'est là ou sont tes informations. Si tu la libères, tu ne peux plus les afficher, tes Tiles/Maps/Pal. Sauf si tu la copies ailleurs.

En général, les jeux avec des très grandes maps libères/charges à la volée, c'est à dire que tu gères toi même ce qui est affiché à l'écran, et lorsque tu vois que tels ou tels tiles/maps n'est plus utilisé, tu libères cette dernière. Par contre, si tu avances, et que la map veut la réafficher, il faut la recharger.

A ton avis, pourquoi dans 90% des jeux DS, les maps sont toute petite? Par paresse? Non, par nécessité.
__________________
Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils, ça ce sont les attributs de la magie.
Tiwaz est déconnecté   Réponse avec citation
Vieux 10/02/2013, 14h54   #5
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

Merci pour ces informations dont je connaissais déjà les termes et les aboutissants. Il est possible de faire de trèèèèèèèèèèèèèèèèèèèèèèès grosses MAP, j'y arrive sans soucis, aucune nécessité de faire des petites, sauf..... si si! par paresse !
Juste ce problème de free() que je ne sais où caser. J'ai essayé divers solutions, et systématiquement, à l'écran suivant: impossibilité de charger un son ou une image à partir du système de fichier EFS, comme si ça bloquait l'accès.

Edit: je viens de tester une map: 96K pixel sur 96K.... comme quoi.... (sauf que je la charge qu'une fois avant de tomber en out of memory à la map suivante )

Dernière modification par Ninnin ; 10/02/2013 à 15h06.
Ninnin est déconnecté   Réponse avec citation
Vieux 10/02/2013, 17h52   #6
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

Bon, personne aura de solution je pense. Et quand bien même il faut réussir à comprendre ce que j'écris.
Ma solution: Allouer de manière définitive des parties mémoire à mes différents fonds (bckg ciel, bckg fond décor, map collision) dans le main, avec un tableau global, en prenant en compte la taille max que j'aurai besoin avec la plus grande des maps que je pourrai créer.
Il me reste environ 996 K de RAM dispo; mais ça a le mérite de marcher.
Ninnin est déconnecté   Réponse avec citation
Vieux 10/02/2013, 18h41   #7
Tiwaz
Newser
 
Date d'inscription: 18/03/2007
Localisation: Un coin trop froid...
Messages: 739
Par défaut

Citation:
Envoyé par Ninnin Voir le message
Edit: je viens de tester une map: 96K pixel sur 96K.... comme quoi.... (sauf que je la charge qu'une fois avant de tomber en out of memory à la map suivante )
Sans le code, toujours difficile de deviner ce que tu fais réellement. Ce que je dis, c'est juste que ton code est bon.

Après, en fonction de ce que tu libères, et quand, tu peux aussi avoir des problèmes de fragmentation mémoire, qui t'empecheront de faire des malloc correct, même si tu as assez de mémoire globale.

Ton problème réel est quand même différent ce que tu annonces au départ. Là, tu dis que c'est si tu fais un free, et que tu charges une nouvelle map que ca foire. Alors que tu arrives à tout charger en mémoire si tu ne fais pas de free?

Autre problème, tu parles de tout allouer en global, ce qui peut aussi supposer que tu as un problème de pile (Comme est configurer devkitpro, chaque fonction est assez limité en espace mémoire possible à allouer sur la pile, et ça, pour trouver pourquoi ca foire lorsque tu sais pas, c'est pas évident).

Citation:
j'y arrive sans soucis, aucune nécessité de faire des petites, sauf..... si si! par paresse !
En effet, mais je maintiens ce que je dis. Les maps de nombreux jeux sont réellement limité par la mémoire DS, en particulier si elles sont riches, la paresse n'a rien à voir la dedans
__________________
Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils, ça ce sont les attributs de la magie.
Tiwaz est déconnecté   Réponse avec citation
Vieux 10/02/2013, 18h47   #8
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

Citation:
Envoyé par Tiwaz Voir le message
tu dis que c'est si tu fais un free, et que tu charges une nouvelle map que ca foire. Alors que tu arrives à tout charger en mémoire si tu ne fais pas de free?
Voilà. Donc ça revient à ce que je disais au départ: si pas de free, ça marche jusqu'à ce qu'il n'y ai plus de mémoire de dispo, puisque à force de malloc dedans, on finit par faire grossir de + en + la fuite de mémoire.

Si y a un free pour éviter cette fuite, impossible de charger la pièce suivante dans le jeu, et un jeu avec une seule pièce, l'exploration va pas aller loin .... (ce que j'appelle pièce est une "room" de jeu, dans laquelle le joueur évolue).
Ninnin est déconnecté   Réponse avec citation
Vieux 10/02/2013, 19h34   #9
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

Dès que je fais un free sur nawak, ça ma plante tous le jeu... génial j'ai envie de dire !

Genre:
char *truk = (char*) malloc (sizeof(char)*32);
free(truk);

---> application plantée !!!!

Bon, je dev depuis des années, j'arrête le dev et je retourne jouer aux lego, je deviens chèvre là.
Parce que là j'dois être con ......
Ninnin est déconnecté   Réponse avec citation
Vieux 11/02/2013, 14h09   #10
Sheeft
Membre confirmé
 
Date d'inscription: 18/04/2009
Messages: 594
Par défaut

Si ça plante, c'est porbablement parce que tu effectues le free alors que les données que tu libères sont encore utilisées…
Tu peux envisager de faire une étape pendant laquelle tu n'affiches plus rien, tu t'occupes seulement de libérer la mémoire, puis de l'allouer à nouveau pour charger ta nouvelle carte, ensuite tu l'affiches.

Ou peut-être que mon approche est trop naïve et que je n'ai pas saisi le problème… (ou qu'il existe une manière plus raffinée de procéder).
__________________

Sheeft est déconnecté   Réponse avec citation
Vieux 12/02/2013, 19h43   #11
Tiwaz
Newser
 
Date d'inscription: 18/03/2007
Localisation: Un coin trop froid...
Messages: 739
Par défaut

Citation:
Envoyé par Ninnin Voir le message
Dès que je fais un free sur nawak, ça ma plante tous le jeu... génial j'ai envie de dire !

Genre:
char *truk = (char*) malloc (sizeof(char)*32);
free(truk);

---> application plantée !!!!

Bon, je dev depuis des années, j'arrête le dev et je retourne jouer aux lego, je deviens chèvre là.
Parce que là j'dois être con ......
Et sinon, une revue de code, c'est possible, ou ton code est trop fermé, et tu ne veux pas le montrer? Parceque là, ton problème est ailleurs (que les fonctions que tu nous as montré), et on ne va pas deviner ce que ton code fait
__________________
Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils, ça ce sont les attributs de la magie.
Tiwaz est déconnecté   Réponse avec citation
Vieux 12/02/2013, 19h51   #12
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

J'ai tentée de créer un nouveau projet, un main.c vierge.
Dedans j'ai mis mon fameux :
char *truk = (char*) malloc (sizeof(char)*32);
free(truk);
PA_OutputText(0,0,0,"test");

ça plante et n'affiche rien sur l'écran inférieur
Bref je laisse tomber quelques jours ça me saoule là.
Ninnin est déconnecté   Réponse avec citation
Vieux 13/02/2013, 00h31   #13
Tiwaz
Newser
 
Date d'inscription: 18/03/2007
Localisation: Un coin trop froid...
Messages: 739
Par défaut

Citation:
Envoyé par Ninnin Voir le message
PA_OutputText(0,0,0,"test");
Tu utilises la PAlib... Ca explique tout .
J'ai testé ton code (sans PALib, je n'ai pas de PAlib fonctionnelle avec les dernieres version devkitpro, juste un affichage direct), ca marche farfaitement.
__________________
Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils, ça ce sont les attributs de la magie.
Tiwaz est déconnecté   Réponse avec citation
Vieux 13/02/2013, 01h10   #14
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

PAlib fonctionne très bien, et n'a rien à voir avec mon souci de free et malloc. Ce sont des instructions de base en C. Je suis passé également par un print direct sur DS sans PAlib, et idem. Je pense à une couille qui se serait fourrée je ne sais comment dans le devkit, le compilateur ou je ne sais quoi d'autre.
Je vais toucher à rien, et essayer sur un autre PC avec une installation propre (enfin si j'arrive à retrouver les bonne version qui vont bien vu que palib.info est dead.... )
Ninnin est déconnecté   Réponse avec citation
Vieux 13/02/2013, 13h30   #15
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

Voilà, tout réinstallé nickel, je n'ai rien touché au code source et .... ça marche...
Des fois faut pas chercher .... -_-''''''

que de temps perdu pfffffffffffffffffffffffffff
Ninnin est déconnecté   Réponse avec citation
Vieux 14/02/2013, 00h13   #16
Tiwaz
Newser
 
Date d'inscription: 18/03/2007
Localisation: Un coin trop froid...
Messages: 739
Par défaut

Citation:
Envoyé par Ninnin Voir le message
PAlib fonctionne très bien, et n'a rien à voir avec mon souci de free et malloc.
Vu que tu es nouveau, c'est compréhensible que tu sois passé à coté, mais je tiens à te le préciser, c'était de l'humour de ma part la boutade gratuite sur PAlib.

Content que cela remarche pour toi.
__________________
Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils, ça ce sont les attributs de la magie.
Tiwaz est déconnecté   Réponse avec citation
Vieux 14/02/2013, 01h43   #17
Ninnin
Membre
 
Date d'inscription: 30/01/2013
Messages: 21
Par défaut

Si ça n'avait pas été de l'humour, y a longtemps que je t'aurai avalé tout cru, digéré et .... bah quoi

J'avais vu hein je suis bête mais pas totalement dénué d'intelligence, il doit quand même me rester un ou deux neurones en "état"

Puis que ferait-on dans ce monde si l'humour n'existait pas
Je me sens d'humeur à écrire un pavé là dessus...

Allons-y
Il était une fois.... ok ok je sors --->

Ninnin 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
PSP Le hack PSP pour les n00bs Partie 1 Riolehh Articles et Tutos 44 12/08/2008 12h27
NDS Faire une skin pour MoonShell M@cZér0 Articles et Tutos 35 12/04/2008 02h44
NDS Aide pour DipStar ShiRo Archives - Divers (NDS) 6 18/03/2007 13h50
GBA LUA in my game Dr.Vince Tutoriels 7 13/09/2006 20h22


Fuseau horaire GMT +2. Il est actuellement 12h52.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2021, 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