vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
26 juil. 2006 à 14:40
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 2006
-
2 août 2006 à 22:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 2 août 2006 à 22:36
En tout cas je te conseil d'eviter les optimisations de ce genre, à savoir itérer à rebourd et faire x*2 + x au lieu de x*3, car au mieux le gain est presque invisible, au pir tu empeches le compilateur de faire de vrais optimisations et dans tout les cas ca rend le code moins lisible.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 2 août 2006 à 22:13
Mais ce n'est qu'un simple exemple. Bien sûr que j'aurais pu modifier tel et tel pixel sans avoir recour à une boucle (ou une mais petite). Ce que je voulais faire, c'est une simple manipulation dans le buffer (ici changer les couleurs de chaque pixels) tout en montrant le calcule pour trouver une position x et y dans le buffer. Non ce n'est pas ce qu'il y a de plus optimisé mais je voulais montrer cette fonctionnalité le plus simplement possible.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 août 2006 à 21:49
Oui, mais ce n'est pas une raison pour le faire dans un boucle.
Je suis pss du tout ton raisonnement:
-d'une part tu converge vers 0 parce que c'est soit-disant plus rapide (une instruction en moins)
-d'autre part tu ralentis considérablement la boucle en faisant à chaque tour un calcul inutile
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 2 août 2006 à 21:31
D'après ce que j'en sais, une lecture séquencielle signifie lire les valeurs dans l'ordre une à la suite de l'autre. C'est évident que cette méthode va beaucoup plus vite que de calculer à chaque tour de boucle la position x et y mais il devien impossible d'optenir une position bien précise en un calcule. Il est toujours intéressent de savoir comment aller à la position x et y de son image à partir du buffer. Ça permet de modifier bien spécifiquement son image.
cs_Omeya
Messages postés28Date d'inscriptiondimanche 4 mai 2003StatutMembreDernière intervention10 août 2006 2 août 2006 à 18:45
Je crois avoir trouvé... Je ne sais pas si c'est ça, mais "séquentiellement" signifie incrémenter ou décrémenter un pointeur sur le tableau LPBYTE. Dites-moi si j'ai faux.
En tout cas, j'ai testé la méthode séquentielle et ça marche.
cs_Omeya
Messages postés28Date d'inscriptiondimanche 4 mai 2003StatutMembreDernière intervention10 août 2006 2 août 2006 à 16:13
steve_clamage : "Tu enlèves une comparaison mais ton calcul de pos est plus complexe, surtout que comme l'a dit vecchio56 ca peut se parcourir en une seule boucle."
J'ai du mal à comprendre quand vous dites qu'il suffit de passer toute la zone mémoire séquentiellement.
Quel est le code en une seule boucle, svp?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 29 juil. 2006 à 23:25
"Ah et pour le x+x*2 à la place de x*3 c'est que x*3 va générer un imul très coûteux en temps processeur. x+x*2 va générer un lea, beaucoup moin long à executer et tout aussi efficasse."
Le compilateur n'est pas con, si nous on peut le faire alors lui... . J'ai testé avec gcc (en -O3) et il me génère exactement la meme sortie pour x*3 et x*2 +x, avec le leal. Le but d'un compilateur c'est de ne plus avoir à penser en logique assembleur, sinon autant écrire directement en assembleur pour avoir un vrai controle sur le code. Il ne faut pas non plus oublier que le compilateur sais optimiser un code dans la mesure du possible, tant qu'il possède assez d'information pour etre sur de ne pas casser la sémantique du code.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 29 juil. 2006 à 23:21
Je crois que tu as raison. J'ai fait des listings et à première vue, le calcule bouffe beaucoup de temps processeur.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 29 juil. 2006 à 23:12
Tu enlèves une comparaison mais ton calcul de pos est plus complexe, surtout que comme l'a dit vecchio56 ca peut se parcourir en une seule boucle.
Tu devrais faire des tests car tu gagnes presque rien (un cmp contre un jns), ca peut meme empecher le compilateur de faire de vrai optimisations (comme une vectorisation). En générale on optimise ce qui prend du temps, pas le code d'une boucle !
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 29 juil. 2006 à 23:11
Ah et pour le x+x*2 à la place de x*3 c'est que x*3 va générer un imul très coûteux en temps processeur. x+x*2 va générer un lea, beaucoup moin long à executer et tout aussi efficasse.
P.S. Merci à BruNews, c'est lui qui m'a apprit tout ça :)
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 29 juil. 2006 à 23:01
Soustraire vers 0 est toujours plus rapide que d'additionner de 0:
for (y = 0; y < bi.bmiHeader.biHeight; y++)
xor ebx, ebx ;;; y = 0
lblFOR:
;;; divers codes
inc ebx
cmp ebx, bi.bmiHeader.biHeight <- ICI cette comparaison prend du temps processeur et peut être évité
jb lblFOR
for (y = bi.bmiHeader.biHeight - 1; y >= 0; y--)
mov ebx, bi.bmiHeader.biHeight - 1
lblFOR:
;;; divers codes
dec ebx
jns lblFOR
Normalement oui vecchio mais comme pour mon autre source, ceci a aussi pour but de montrer comment calculer la position x et y dans le buffer.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 29 juil. 2006 à 22:59
Normalement on ne devrait pas avoir a calculer de position a chaque tour de boucle. Il suffit de passer toute la zone mémoire séquentiellement
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 29 juil. 2006 à 22:46
Pourquoi ne pas parcourir l'image comme ca tout simplement ?
for(y = 0; y < bi.bmiHeader.biHeight; y++)
{
for(x = 0; x < bi.bmiHeader.biWidth; x++)
{
// Calcule de la position dans le buffer
const int pos = (y * bi.bmiHeader.biWidth) + x*3;
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 29 juil. 2006 à 22:20
Peux tu expliquer ce que tu veux dire s'il te plait?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 29 juil. 2006 à 22:16
Pourquoi parcourir l'image de cette façon ? C'est peut lisible et au final c'est moins efficace ??
cs_eRoZion
Messages postés241Date d'inscriptionvendredi 23 mai 2003StatutMembreDernière intervention 8 octobre 20071 27 juil. 2006 à 05:48
Salut,
merci pour la source. :)
Ca fonctionne chez moi (nouvelle version de l'exe qui fonctioone chez tout le monde à prioris, pas testé la précédente).
Sinon pour l'ortho de "bizzard", je pense tout simplement que c'est le syndrome de la génération blizzard. :D
A+
eRoZion
gamemonde
Messages postés336Date d'inscriptionsamedi 9 août 2003StatutMembreDernière intervention 9 juillet 20112 27 juil. 2006 à 02:04
oui maintenant ca marche tres bonne source ca va en aider beaucoup moi-de-meme qui defois me pert dans cette fonction
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 18:25
Oui je pense que c'est bon
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 18:19
Ok c'est fait. L'exe est-il fonctionnel à présent?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 18:07
Bingo. J'ai tout compris. En fait, étant donné que je récupère les données du DC mémoire, ce DC mémoire prend le nombre de couleurs de l'écran. Donc bmp.bmBitsPixel renvoie le nombre de couleur présent dans le DC mémoire qui est égual au nombre de couleur de votre système. Vue que je suis en 16 bits ici, moi ça fonctionnait mais il modifiait uniquement le bleu et le vert. Bon je modifie le code et je fais quelque test de sécurité et je vous renvoie ça.
Merci vecchio, c'est grâce à toi que j'ai allumé.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 17:55
Ok je comprend. C'est le calcule de la taille du buffer le problème. D'accord. Je modifie le code pour le forcer à prendre du 24 bits.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 17:39
Ca marche si on force bmp.bmBitsPixel à 24 juste après GetObject(hBmp, sizeof(bmp), &bmp);
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 17:28
L'appel de GetDIBits retourne 0 chez moi
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 17:26
Ah oui j'avais pas vu, merci!
Ben non logiquement ca peut pas venir de ca. Je vais voir si je trouve d'ou ca vient
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 17:22
Ête vous capable de voir ce qui ne fonctionne pas dans le code? Moi j'ai bo chercher, je ne suis pas famillié avec les dialog
P.S. J'ai utiliser ton éditeur vecchio. Ce pourrait-il que ce soit le dialog le problème?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 17:11
Je vien de tester sur mon autre ordinateur et en effet, ça ne fonctionne pas non plus. C'est trop bizzard. Pourquoi tout fonctionne sur mon ordi mais pas sur les votres
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 26 juil. 2006 à 16:48
Salut,
Je viens de tester l'exe et pas de modification de l'image chez moi non plus.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 16:45
J'ouvre mspaint, je gribouille un peu
J'enregistre l'image au format bmp 24 bits
Je lance ton programme
J'ouvre l'image que je viens d'enregistrer
J'appuie sur Modifier comme un forcené, mais rien ne se passe (on voit bien l'image mais elle ne change pas)
Désolé mais ce n'est pas une blague
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 16:33
C'est pas une blague que t'es entrait de me faire là ;)?
Sinon, décrit moi ce que tu fait. Il ne se passe vraiment rien quand tu clique sur modifier?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 16:25
Ben là. Excuse pour les fautes. Je vien d'apprendre qu'un membre de ma famille est mort alors ça me débousole un peu. Sinon, je ne comprend vraiment pas. Tout fonctionne ici. Même si je télécharge l'exe, il fonctionne qu'en même.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 16:19
C'est fou le nombre de gens qui ne savent pas écrire bizarre :)
Ben non j'ai pas recompilé, c'est quand même censé marcher directement avec l'exécutable
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 16:14
C'est bizzard. Moi tout les bmp que j'ai tester ce modifiais quand je cliquais sur modifier. A tu essayé en recompilant le code?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 26 juil. 2006 à 16:10
Oui dans le code je l'ai vu, mais quand je teste l'exécutable, l'image n'est pas modifiée
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 26 juil. 2006 à 15:33
for(y = bi.bmiHeader.biHeight-1; y >= 0; y--)
{
for(x = bi.bmiHeader.biWidth-1; x >= 0; x--)
{
// Calcule de la position dans le buffer
int pos = (bi.bmiHeader.biHeight-y-1)*ByteWidth+x+x*2;
2 août 2006 à 22:36
2 août 2006 à 22:13
2 août 2006 à 21:49
Je suis pss du tout ton raisonnement:
-d'une part tu converge vers 0 parce que c'est soit-disant plus rapide (une instruction en moins)
-d'autre part tu ralentis considérablement la boucle en faisant à chaque tour un calcul inutile
2 août 2006 à 21:31
2 août 2006 à 18:45
En tout cas, j'ai testé la méthode séquentielle et ça marche.
2 août 2006 à 16:13
J'ai du mal à comprendre quand vous dites qu'il suffit de passer toute la zone mémoire séquentiellement.
Quel est le code en une seule boucle, svp?
29 juil. 2006 à 23:25
Le compilateur n'est pas con, si nous on peut le faire alors lui... . J'ai testé avec gcc (en -O3) et il me génère exactement la meme sortie pour x*3 et x*2 +x, avec le leal. Le but d'un compilateur c'est de ne plus avoir à penser en logique assembleur, sinon autant écrire directement en assembleur pour avoir un vrai controle sur le code. Il ne faut pas non plus oublier que le compilateur sais optimiser un code dans la mesure du possible, tant qu'il possède assez d'information pour etre sur de ne pas casser la sémantique du code.
29 juil. 2006 à 23:21
29 juil. 2006 à 23:12
Tu devrais faire des tests car tu gagnes presque rien (un cmp contre un jns), ca peut meme empecher le compilateur de faire de vrai optimisations (comme une vectorisation). En générale on optimise ce qui prend du temps, pas le code d'une boucle !
29 juil. 2006 à 23:11
P.S. Merci à BruNews, c'est lui qui m'a apprit tout ça :)
29 juil. 2006 à 23:01
for (y = 0; y < bi.bmiHeader.biHeight; y++)
xor ebx, ebx ;;; y = 0
lblFOR:
;;; divers codes
inc ebx
cmp ebx, bi.bmiHeader.biHeight <- ICI cette comparaison prend du temps processeur et peut être évité
jb lblFOR
for (y = bi.bmiHeader.biHeight - 1; y >= 0; y--)
mov ebx, bi.bmiHeader.biHeight - 1
lblFOR:
;;; divers codes
dec ebx
jns lblFOR
Normalement oui vecchio mais comme pour mon autre source, ceci a aussi pour but de montrer comment calculer la position x et y dans le buffer.
29 juil. 2006 à 22:59
29 juil. 2006 à 22:46
for(y = 0; y < bi.bmiHeader.biHeight; y++)
{
for(x = 0; x < bi.bmiHeader.biWidth; x++)
{
// Calcule de la position dans le buffer
const int pos = (y * bi.bmiHeader.biWidth) + x*3;
lpBits[pos]++; // Bleu
lpBits[pos+1]++; // Vert
lpBits[pos+2]++; // Rouge
}
}
29 juil. 2006 à 22:20
29 juil. 2006 à 22:16
27 juil. 2006 à 05:48
merci pour la source. :)
Ca fonctionne chez moi (nouvelle version de l'exe qui fonctioone chez tout le monde à prioris, pas testé la précédente).
Sinon pour l'ortho de "bizzard", je pense tout simplement que c'est le syndrome de la génération blizzard. :D
A+
eRoZion
27 juil. 2006 à 02:04
26 juil. 2006 à 18:25
26 juil. 2006 à 18:19
26 juil. 2006 à 18:07
Merci vecchio, c'est grâce à toi que j'ai allumé.
26 juil. 2006 à 17:55
26 juil. 2006 à 17:39
26 juil. 2006 à 17:28
26 juil. 2006 à 17:26
Ben non logiquement ca peut pas venir de ca. Je vais voir si je trouve d'ou ca vient
26 juil. 2006 à 17:22
P.S. J'ai utiliser ton éditeur vecchio. Ce pourrait-il que ce soit le dialog le problème?
26 juil. 2006 à 17:11
26 juil. 2006 à 16:48
Je viens de tester l'exe et pas de modification de l'image chez moi non plus.
26 juil. 2006 à 16:45
J'enregistre l'image au format bmp 24 bits
Je lance ton programme
J'ouvre l'image que je viens d'enregistrer
J'appuie sur Modifier comme un forcené, mais rien ne se passe (on voit bien l'image mais elle ne change pas)
Désolé mais ce n'est pas une blague
26 juil. 2006 à 16:33
Sinon, décrit moi ce que tu fait. Il ne se passe vraiment rien quand tu clique sur modifier?
26 juil. 2006 à 16:25
26 juil. 2006 à 16:19
Ben non j'ai pas recompilé, c'est quand même censé marcher directement avec l'exécutable
26 juil. 2006 à 16:14
26 juil. 2006 à 16:10
26 juil. 2006 à 15:33
{
for(x = bi.bmiHeader.biWidth-1; x >= 0; x--)
{
// Calcule de la position dans le buffer
int pos = (bi.bmiHeader.biHeight-y-1)*ByteWidth+x+x*2;
lpBits[pos]++; // Bleu
lpBits[pos+1]++; // Vert
lpBits[pos+2]++; // Rouge
}
}
Changement de la couleur de chaque pixel à partir du buffer.
26 juil. 2006 à 14:40