Page 1 sur 1

Mon prog me bouffe de la ram et du temps CPU

Publié : sam. 24/mai/2008 12:11
par Octavius
J'ai fait un programme dont le but est d'éditer des cartes en 2D. Lorsque j'utilise le bouton 'Zoomer' pour zoomer sur ces cartes, le temps de calcul augmente avec la taille du zoom, et pire, le programme occupe une bonne partie de ma ram. Un pote à moi qui a tester mon programme ne peut pas zoomer au maximum parce qu'il a une ram plus petite que la mienne : le programme se bloque.

Cette archive contient mon code source, un éxecutable, et les fichiers annexes utilisés par le programme :
http://keonet.free.fr/Geomod/geomod.rar

Pouvez-vous m'aider à comprendre ce qui cloche ?

PS: lorsque le prog vous demande au début de choisir un dossier, cliquez sur OK sans réfléchir, c'est automatiquement le bon dossier.

Re: Mon prog me bouffe de la ram et du temps CPU

Publié : sam. 24/mai/2008 12:39
par beauregard
Octavius a écrit :Un pote à moi qui a tester mon programme ne peut pas zoomer au maximum parce qu'il a une ram plus petite que la mienne : le programme se bloque.
je confirme: à 510Mo sur les 512Mo de mon vieux PC, il n'a vraiment pas apprécié 8O

Publié : sam. 24/mai/2008 12:50
par Octavius
J'ai 2 Go de ram, le programme ne se bloque pas, mais ça fait quand même ramer mon PC pendant le zoom...

J'ai fait un petit calcul vite fait, en gros je travaille avec une carte qui comporte 5 calques (répartis dans 5 fichiers TGA). Lorsque j'aggrandit mes sprites au zoom maximum (16 fois), mes cartes de base font environ 590*380 pixels, ça me fait (chaque pixel vaut 3 octets, 24 bits) :
820 Mo !!!!

Euh... vous avez pas une idée pour m'aider ? :(

Publié : sam. 24/mai/2008 13:51
par Backup
ton probleme viens d'un plantage de ton prg !!

en ligne 267 sur:

Code : Tout sélectionner

 DrawImage(ImageID(MapID),0,0)
apparement purebasic perds L'id de l'image
il faut dire qu'a ce moment precis ton image fait :
9456 X 6064

ya peut etre une limite de taille des images en purebasic !!

le fait est que ta methode de zoom n'est pas genial !!
il te faudrai Clipper l'image de façon a n'afficher que ce qui se trouve dans ton cadre
la on se rends bien compte que l'image est enorme, et tu cadre qu'une petite partie..

il faudrai peut etre mieux zoomer , le resultat du premier zoom
puis les resultat du resultat etc ... plutot que d'augmenter indefiniment la taile de l'image dans son entier ...
tu ferai une sacre economie de place memoire !!
en clair oblige toi a ne pas avoir d'image plus grande que 1024x768 par exemple , et de zoomer le contenu de ces 1024x768
pas besoin pour ça de transformer une image 1024x768 en une image qui fasse 9456 X 6064 ... :)

et tu ne depasserai pas la limite maxi qu'apparement Purebasic (ou la RAM ) impose ... voila , désolé, pas le temps d'en faire plus .. :)

Publié : sam. 24/mai/2008 15:01
par Ar-S
Dans la doc les amis :

Note : La taille des images est actuellement limitée à 8192x8192 pixels (si la mémoire disponible le permet).

Publié : sam. 24/mai/2008 16:56
par beauregard
Ar-S a écrit :Dans la doc les amis :

Note : La taille des images est actuellement limitée à 8192x8192 pixels (si la mémoire disponible le permet).
je rajouterai que pour la version 4.10 de pb, dans la pratique( utilisation de clipsprite, Dobro est de bon conseils), c'est plutôt 4096*4096.

quand à la version 4.20, c'est encore trop frais pour que j'émette un avis.

Publié : sam. 24/mai/2008 18:41
par Octavius
Ah ok je vois... Je vais réfléchir à cette solution avec clipsprite...

Publié : sam. 24/mai/2008 19:50
par Oliv
Le soldat inconnu avait posté le code d'une loupe, regarde comment il avait fait, ça pourrait te donner des idées pour l'optimisation de ton zoom :wink:

Publié : sam. 24/mai/2008 20:09
par Octavius
OK j'ai trouvé son code !
http://www.purebasic.fr/french/viewtopic.php?t=7877

Je regarde ça de plus près.

Publié : mer. 28/mai/2008 17:22
par Octavius
J'ai progressé, enfin pour ainsi dire...

Voilà mon nouveau programme (exécutable, source, et fichiers annexes inclus) : http://keonet.free.fr/Geomod/geomod2.rar

Suite à vos conseils, je n'agrandis plus toute l'image lorsque je zoome, mais seulement la partie qui sera affichée. Pour cela j'utilise la fonction GrabImage().

Ce nouveau code, que j'ai eu beaucoup de mal à écrire ( :oops: ) a en quelque sorte déplacer le problème : maintenant, dès qu'on bouge un peu à gauche, ou à droite, ou en haut, ou en bas la partie de l'image affichée change, et il est donc nécessaire de relancer la procédure avec GrabImage()... Résultat : se déplacer est fastidieux, le nombre de calculs effectués reste important.

Pourriez-vous encore m'aider ? Y a-t-il une astuce plus rapide que la fonction GrabImage() ? N'y a-t-il pas un autre moyen de procéder ?

Publié : dim. 01/juin/2008 14:44
par Octavius
C bon, j'ai réussi à optimiser l'utilisation de GrabImage().

J'ai fait une tentative en écrivant directement sur la mémoire vidéo mais ça n'a rien donné, ce n'était pas plus rapide.