Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 2 déc. 2006 à 18:59
Résumons...
Pour éxprimer une couleur, on utilise un nombre (Long)
par exemple, du rouge vif, sera du 16711680
et du vert, du 65280
en fait, chacune des trois couleurs (rouge vert bleu) sont mélangées, afin d'obtenir ce nombre. Nous souhaitons ici simplement retrouver la quantité de rouge, de vert et de bleu utilisée pour une couleur donnée...
est-ce plus clair ?
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 2 déc. 2006 à 18:41
Comprends-tu au moins le but du problème ?
fierobe
Messages postés14Date d'inscriptiondimanche 27 août 2006StatutMembreDernière intervention 3 août 2010 1 déc. 2006 à 22:14
Je comprends rien ...
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 4 nov. 2006 à 01:27
Arf, aussi facile à dire qu'a faire !!! Grrr ce qu'il peut m'énerver ce EB avec tout c'qu'il sait ;-)
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 3 nov. 2006 à 23:30
On peux faire du tres bon code avec VB, il suffit de comprendre la machine et d'utiliser les bon type et les bon operations. Oublier les fonctions de script, les variants, les fonction de conversion et cocher toutes les options d'optimisation. Rien que ça permet de ce rapprocher d'un code similaire en C/C++. Apres on ce heurte a l'initialisation de la stack frame, aux quelques appels inevitable a la machine virtuelle et autre gestion du code d'erreur.
Mais on peut outrepasser tout cela avec une petite injection de code assembleur bien placer et tout roule.
@+
GeneticW
Messages postés34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 3 nov. 2006 à 22:58
Non, pas offensé du tout... c'est juste qu'une API de bit shift est facile a faire, ca ma pas pris 5 minutes.
il n'y a pas de secret dans ce genre de sources...
comme tu le mentionnais, Vb a avantage a utiliser les API a cause de la vitesse.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 3 nov. 2006 à 22:46
Je n'ais pas voulu d'offenser Genetic, c'est juste que je préfère tout faire moi-même, garder le contrôle de mon code en quelque sorte... En tant que codeur, je pense que tu peux comprendre cet attachement à tout faire soit-même !
GeneticW
Messages postés34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 3 nov. 2006 à 17:53
<<Du bit shifting... avec une dll... hum...
<<Non, je préfère coder mon truc en "pure VB/APIwin32
hmmm... ma DLL est une API Win32 VS 6.0 utilisant VC
tu as sans doute voulu dire pure VB tout court.
malheureusement, Vb n'offre pas directement de bit shifting, ce qui est bien domage parce que c'est ultra rapide.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 3 nov. 2006 à 16:44
Warf, merchi Renfield !!! Franchement t'assure trop grave (les autres aussi, mais perso, si j'aime bien Warning, je trouve que EB, Renfield et Brunews sont quand même les meilleurs !!! Respect les mecs : on a besoin d'vous ;-)
Du bit shifting... avec une dll... hum... Non, je préfère coder mon truc en "pure VB/APIwin32" !
Donc, pour résumer, voici toutes les techniques dont ont dispose :
- Le calcule avec des bonnes vieilles variables et chiffres en décimal ;
- Un calcul similaire (ma méthode) mais en Hexa avec des fonctions logiques et optimisé (le dernier calcul - la spécificité de ma source donc)
- Utiliser un "transfère" octal via Lset et deux structures de types (stcColor.Value en Long et stcRGB.R .G .B en Byte)
- CopyMemory, le fameux, dont j'ignore toujours l'utilisation (et l'utilité du même coup... [si on bonne âme pouvait me résumer clairement son utilisation et surtout son rôle...])
- Et enfin, en exclusivité mondiale (pour moi tout du moins... je sais, chuis pas l'centre du monde...) SafeArray
Ai-je fais le tour de toutes les stechniques envisageables ou en avez-vous d'autres cachées sur vos disques durs les amis ????
Si y'a bien que ça, qu'attendons-nous pour faire un tuto complet ???
EB] C'est, en effet, comme tu peux te l'imaginer, un prog critique et cette fois (contrairement à mes sources sur VBF) a but plus utile que pédagogique. J'utilise les API a outrance. Et je me suis rendu compte que dessiner une ligne via Line est presque plus lent que de passer par son propre code de dessin de ligne - avec toutes les améliorations qu'on peut y apporter, vous imaginez bien !!! Du coup, cette fois, je me lance pour de bon. Direction, à terme, moteur 3D perso en VB&API, juste pour le défit, mais aussi, softs de déformations vectorielles de Bitmaps (corrections cartographiques, photos panoramiques, morphing et cie), 3D pixelique (ou réelle) [invention perso], ..., ..., ...
J'aurais d'ailleurs besoin de tous vos conseils et recommandations pour l'améliorer par la suite [si le code n'est pas... TROP PARFAIT ;-))) modestie, quand tu nous tiends ,].
[c'est con que les liens internet soient pas automatiques dans les commentaires des sources !!! C++ chiant à la longue ;]
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 nov. 2006 à 06:33
pour illustrer la technique que j'ai exposée plus haut :
"[...] je pense que le plus rapide est de greffer un tableau de bits sur l'espace mémoire d'un long...
ainsi, modifier les bits du tableaux impacteront également le long, sans aucune opération directe (ou en coulisses, d'ailleurs) supplémentaire...
(voir doc sur les SafeArray)"
GeneticW
Messages postés34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 2 nov. 2006 à 23:09
alors voila, j'ai fait quelques test...
en éliminant les operation arithmetique dans la methode de
ScSami (en les remplacceant par du bit shifting)
la methode de ScSami est PLUS rapide que la conversion de type.
le seul HIC c'est que Vb N'offre pas de facon de faire du bit shifting alors j'ai fait une DLL en C++ pour faire l'operation de Bit Shift. Alors... la methode est plus rapide, mais pas forcement parce que c'est plus rapide, mais peut etre parce que le C++ est plus rapide que le Vb. vaut peut etre mieux s'en tenir a la conversion de type qui est une excellente methode.. et pas de DLL a trainer.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 2 nov. 2006 à 23:08
M'ouai je viens de relire ma remarque... je sais pas ci c'est très clair ! lol (en tout cas c'est clair que c'est plein de fautes ;P )
@+
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 2 nov. 2006 à 23:07
Ce que je pense de la methode de Warning ?
Et bien deja moi ... Warning je l'aime bien ! lol :p
Nan en fait c'est bien dans un prog à priorité "normal" mais si tu fait du code "critique" alors la meilleur methode n'est surement pas celle ci. Deja oublie les couleurs systeme c'est inutile dans un prog graphique autant utilisé un RGBA traditionnel et si vraiment t'as besoin des syscolor fait une boite de dialogue et une fonction de conversion.
Dans ton code si tu veux optimisé tu va devoir choisir "LA" methode qui correspond a ton algo. Par exemple si tu brasses des pixel a la volé autant créer un tableau a x dimension de type RGBA la manoipulation sera naturelle. Si tu travailes au coup par coup un copymemory sera la plus simple des methodes. Puis surtout n'oublie pas que l'optimisation est pyramidale c'est a dire que l'on part du plus generique au plus precis. Souvent en repanssant entierement son algo on y gagne plus qu'en optimisant par ci par la.
@+
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 2 nov. 2006 à 22:30
Oulala... je m'engagerais pas là perso !!!
Non, a mon avis, la technique d'EB est la meilleur et de loin (même si les structures de types sont pas aisées à manipuler) parce que je fais appelle a des opérateurs arithmétiques.
Ceci dit, là, franchement, vous m'avez foutu le doute... Alors je vais tester tout ça très vite parce qu'en plus, là, je suis en plein dans un gros code d'infographie et je dois tout optimiser à fond.
Juste pour info, le petit truc que je vous prépare va tout déchirer... WuPixel, Anti-Aliasing, lignes et triangles avec motifs, le tout gérant l'Alpha (translucidité), ... Je vous en dis pas plus... La révolution est en marche ;D
N'empêche que je voulais demander à EB ce qu'il pensait de la technique peu orthodoxe de Warning ???
(Genetiw, dit, comment tu penses pouvoir améliorer ça ??????? Pas possible, tout est optimisé à fond dans ce povre code !!! Je vois pas quoi faire de plus si ce n'est changer de technique !)
GeneticW
Messages postés34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 31 oct. 2006 à 13:30
J'utilise depuis des années la methode d'Ebart,
mais la methode de ScSami, utilisant les bit pourrais je crois etre amélioré et devenir "la methode" comme il dit.
La gestion de Bit etant plus rapide que tout en Vb ca c'est la base.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 24 oct. 2006 à 08:21
Oulalal Warning a utilisé une API !! Tu sorts !
lol ;)
@+
cs_Warning
Messages postés516Date d'inscriptionsamedi 3 février 2001StatutMembreDernière intervention24 octobre 20062 24 oct. 2006 à 01:14
Et pour prendre en compte les couleurs système:
Private Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, ByVal hPalette As Long, pccolorref As Any) As Long
Private Sub Command1_Click()
Dim bRGB(0 To 3) As Long
Dim lColor As Long
OleTranslateColor lColor, 0, bRGB(0)
End Sub
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 22 oct. 2006 à 19:14
Arf, c'est vrai, y'a en effet plus rapide si on ne fait même pas de calculs en bossant avec la mémoire (j'avais oublié). Mais bon, disons que ma source n'est qu'un petit erratum par rapport aux nombreuses sources utilisant cette technique.
Il serait intéressant de faire un bon tuto la-dessus... je trouve que c'est un très bon moyen de mieux appréhender les manipulations du bit et de l'octet... Seulement voilà, je ne maitrise pas toutes les techniques liées à la manipulation de la mémoire (CopyMemory, ...)...
Mais je trouve la solution d'EBArt sympa !!!
(Pi dans la série "réinventer la roue", prochaines sources : le WuPixel et Traçage d'une Ligne [et non "prisage d'une li..."]).
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 22 oct. 2006 à 18:45
LSet est une sorte de copie mémoire...
étrange que cela passe, je vois 3 bits d'un coté, dans ta structure, mais quatre, dans l'autre structure, qui contient le long :/
si ce genre de conversion devient une habitude, dans le code, je pense que le plus rapide est de greffer un tableau de bits sur l'espace mémoire d'un long...
ainsi, modifier les bits du tableaux impacteront également le long, sans aucune opération directe (ou en coulisses, d'ailleurs) supplémentaire...
(voir doc sur les SafeArray)
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 22 oct. 2006 à 17:23
Voici un eautre methode ni plus rapide et pas forcement plus simple mais c'est toujours bon a savoir :
Type RGBA
R as byte
G as byte
B as byte
End Type
Type RGBL
X as long
End Type
dim x as RGBL
dim y as RGBA
'========================
'passé de long a RGB
'x vbGreeb 'vbRed 'vbBlue
lset y = x
'========================
'ou inversement
'y.r 255
lset x = y
Donc en resumé aucune api aucun operateur juste une affectation de variable (dans l'exe ce sera un peu different mais bon on va s'arreter la)
@+
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 22 oct. 2006 à 15:15
Renfield avait utilisé un CopyMemory une fois, mais bon aucune idée si c'est plus rapide ou pas, car cela nécessite de déclarer l'api et d'y faire appel. Mais aucun calcul, il faisait un copymemory du premier octet dans l'octet R, le second dans G et le troisième dans B.
Voilà, en tout cas cette source est incontestablement une bonne idée (si c'est effectivement la méthode la plus rapide ;), car il en existe des tonnes à ce sujet et impossible de savoir laquelle choisir.
2 déc. 2006 à 18:59
Pour éxprimer une couleur, on utilise un nombre (Long)
par exemple, du rouge vif, sera du 16711680
et du vert, du 65280
en fait, chacune des trois couleurs (rouge vert bleu) sont mélangées, afin d'obtenir ce nombre. Nous souhaitons ici simplement retrouver la quantité de rouge, de vert et de bleu utilisée pour une couleur donnée...
est-ce plus clair ?
2 déc. 2006 à 18:41
1 déc. 2006 à 22:14
4 nov. 2006 à 01:27
3 nov. 2006 à 23:30
Mais on peut outrepasser tout cela avec une petite injection de code assembleur bien placer et tout roule.
@+
3 nov. 2006 à 22:58
il n'y a pas de secret dans ce genre de sources...
comme tu le mentionnais, Vb a avantage a utiliser les API a cause de la vitesse.
3 nov. 2006 à 22:46
3 nov. 2006 à 17:53
<<Non, je préfère coder mon truc en "pure VB/APIwin32
hmmm... ma DLL est une API Win32 VS 6.0 utilisant VC
tu as sans doute voulu dire pure VB tout court.
malheureusement, Vb n'offre pas directement de bit shifting, ce qui est bien domage parce que c'est ultra rapide.
3 nov. 2006 à 16:44
Du bit shifting... avec une dll... hum... Non, je préfère coder mon truc en "pure VB/APIwin32" !
Donc, pour résumer, voici toutes les techniques dont ont dispose :
- Le calcule avec des bonnes vieilles variables et chiffres en décimal ;
- Un calcul similaire (ma méthode) mais en Hexa avec des fonctions logiques et optimisé (le dernier calcul - la spécificité de ma source donc)
- Utiliser un "transfère" octal via Lset et deux structures de types (stcColor.Value en Long et stcRGB.R .G .B en Byte)
- CopyMemory, le fameux, dont j'ignore toujours l'utilisation (et l'utilité du même coup... [si on bonne âme pouvait me résumer clairement son utilisation et surtout son rôle...])
- Et enfin, en exclusivité mondiale (pour moi tout du moins... je sais, chuis pas l'centre du monde...) SafeArray
Ai-je fais le tour de toutes les stechniques envisageables ou en avez-vous d'autres cachées sur vos disques durs les amis ????
Si y'a bien que ça, qu'attendons-nous pour faire un tuto complet ???
EB] C'est, en effet, comme tu peux te l'imaginer, un prog critique et cette fois (contrairement à mes sources sur VBF) a but plus utile que pédagogique. J'utilise les API a outrance. Et je me suis rendu compte que dessiner une ligne via Line est presque plus lent que de passer par son propre code de dessin de ligne - avec toutes les améliorations qu'on peut y apporter, vous imaginez bien !!! Du coup, cette fois, je me lance pour de bon. Direction, à terme, moteur 3D perso en VB&API, juste pour le défit, mais aussi, softs de déformations vectorielles de Bitmaps (corrections cartographiques, photos panoramiques, morphing et cie), 3D pixelique (ou réelle) [invention perso], ..., ..., ...
J'aurais d'ailleurs besoin de tous vos conseils et recommandations pour l'améliorer par la suite [si le code n'est pas... TROP PARFAIT ;-))) modestie, quand tu nous tiends ,].
[c'est con que les liens internet soient pas automatiques dans les commentaires des sources !!! C++ chiant à la longue ;]
3 nov. 2006 à 06:33
http://www.vbfrance.com/code.aspx?ID=40189
pour illustrer la technique que j'ai exposée plus haut :
"[...] je pense que le plus rapide est de greffer un tableau de bits sur l'espace mémoire d'un long...
ainsi, modifier les bits du tableaux impacteront également le long, sans aucune opération directe (ou en coulisses, d'ailleurs) supplémentaire...
(voir doc sur les SafeArray)"
2 nov. 2006 à 23:09
en éliminant les operation arithmetique dans la methode de
ScSami (en les remplacceant par du bit shifting)
la methode de ScSami est PLUS rapide que la conversion de type.
le seul HIC c'est que Vb N'offre pas de facon de faire du bit shifting alors j'ai fait une DLL en C++ pour faire l'operation de Bit Shift. Alors... la methode est plus rapide, mais pas forcement parce que c'est plus rapide, mais peut etre parce que le C++ est plus rapide que le Vb. vaut peut etre mieux s'en tenir a la conversion de type qui est une excellente methode.. et pas de DLL a trainer.
2 nov. 2006 à 23:08
@+
2 nov. 2006 à 23:07
Et bien deja moi ... Warning je l'aime bien ! lol :p
Nan en fait c'est bien dans un prog à priorité "normal" mais si tu fait du code "critique" alors la meilleur methode n'est surement pas celle ci. Deja oublie les couleurs systeme c'est inutile dans un prog graphique autant utilisé un RGBA traditionnel et si vraiment t'as besoin des syscolor fait une boite de dialogue et une fonction de conversion.
Dans ton code si tu veux optimisé tu va devoir choisir "LA" methode qui correspond a ton algo. Par exemple si tu brasses des pixel a la volé autant créer un tableau a x dimension de type RGBA la manoipulation sera naturelle. Si tu travailes au coup par coup un copymemory sera la plus simple des methodes. Puis surtout n'oublie pas que l'optimisation est pyramidale c'est a dire que l'on part du plus generique au plus precis. Souvent en repanssant entierement son algo on y gagne plus qu'en optimisant par ci par la.
@+
2 nov. 2006 à 22:30
Non, a mon avis, la technique d'EB est la meilleur et de loin (même si les structures de types sont pas aisées à manipuler) parce que je fais appelle a des opérateurs arithmétiques.
Ceci dit, là, franchement, vous m'avez foutu le doute... Alors je vais tester tout ça très vite parce qu'en plus, là, je suis en plein dans un gros code d'infographie et je dois tout optimiser à fond.
Juste pour info, le petit truc que je vous prépare va tout déchirer... WuPixel, Anti-Aliasing, lignes et triangles avec motifs, le tout gérant l'Alpha (translucidité), ... Je vous en dis pas plus... La révolution est en marche ;D
N'empêche que je voulais demander à EB ce qu'il pensait de la technique peu orthodoxe de Warning ???
(Genetiw, dit, comment tu penses pouvoir améliorer ça ??????? Pas possible, tout est optimisé à fond dans ce povre code !!! Je vois pas quoi faire de plus si ce n'est changer de technique !)
31 oct. 2006 à 13:30
mais la methode de ScSami, utilisant les bit pourrais je crois etre amélioré et devenir "la methode" comme il dit.
La gestion de Bit etant plus rapide que tout en Vb ca c'est la base.
24 oct. 2006 à 08:21
lol ;)
@+
24 oct. 2006 à 01:14
Private Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, ByVal hPalette As Long, pccolorref As Any) As Long
Private Sub Command1_Click()
Dim bRGB(0 To 3) As Long
Dim lColor As Long
OleTranslateColor lColor, 0, bRGB(0)
End Sub
22 oct. 2006 à 19:14
Il serait intéressant de faire un bon tuto la-dessus... je trouve que c'est un très bon moyen de mieux appréhender les manipulations du bit et de l'octet... Seulement voilà, je ne maitrise pas toutes les techniques liées à la manipulation de la mémoire (CopyMemory, ...)...
Mais je trouve la solution d'EBArt sympa !!!
(Pi dans la série "réinventer la roue", prochaines sources : le WuPixel et Traçage d'une Ligne [et non "prisage d'une li..."]).
22 oct. 2006 à 18:45
étrange que cela passe, je vois 3 bits d'un coté, dans ta structure, mais quatre, dans l'autre structure, qui contient le long :/
si ce genre de conversion devient une habitude, dans le code, je pense que le plus rapide est de greffer un tableau de bits sur l'espace mémoire d'un long...
ainsi, modifier les bits du tableaux impacteront également le long, sans aucune opération directe (ou en coulisses, d'ailleurs) supplémentaire...
(voir doc sur les SafeArray)
22 oct. 2006 à 17:23
Type RGBA
R as byte
G as byte
B as byte
End Type
Type RGBL
X as long
End Type
dim x as RGBL
dim y as RGBA
'========================
'passé de long a RGB
'x vbGreeb 'vbRed 'vbBlue
lset y = x
'========================
'ou inversement
'y.r 255
lset x = y
Donc en resumé aucune api aucun operateur juste une affectation de variable (dans l'exe ce sera un peu different mais bon on va s'arreter la)
@+
22 oct. 2006 à 15:15
Voilà, en tout cas cette source est incontestablement une bonne idée (si c'est effectivement la méthode la plus rapide ;), car il en existe des tonnes à ce sujet et impossible de savoir laquelle choisir.
Je me tiens au courant ;)