cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018
-
8 févr. 2009 à 09:57
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 2013
-
13 août 2009 à 07:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 13 août 2009 à 07:19
c'est limpide, merci
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 12 août 2009 à 22:53
A l'époque où j'ai développé cette technique, je n'utilisais que VBA ; or dans ce langage, les handles des contrôles ne sont pas exposés comme en VB, ce qui empêche l'utilisation d'un très grand nombre d'API, comme celles sur la gestion de bitmaps. J'ai donc essayé d'autres méthodes, comme la fonction SetPixel, qui s'est révélée très lente.
L'importation d'image à partir d'un fichier bitmap me paraissant la seule solution pratique, j'ai, comme tu l'as évoqué, comparé les approches "mémoire" et "disque" de la gestion d'une image Windows bitmap. J'ai alors constaté que dessiner dans un fichier, en mémoire virtuelle, était plus rapide et moins gourmand en ressources que de travailler en mémoire avec des tableaux à deux dimensions. Cette bonne performance est due au fait, je pense, que les accès au disque se font seulement à l'ouverture et à la fermeture du fichier et que, dans l'intervalle, le système écrit dans le cache. Ceci est vrai à la condition que le fichier soit créé à sa taille définitive, sinon le système est susceptible d'accéder au disque en cours de travail pour ajuster la taille du fichier. Il faut donc utiliser un format Windows Bitmap non compressé, qui est à ma connaissance le seul format de fichier d'image dont on peut prévoir la taille exacte sans connaître le contenu. Ces conditions étant remplies, le fichier peut être utilisé comme mémoire vituelle (ce qui, au passage, allège considérablement les ressources de l'application).
Aujourd'hui, bien que je ne développe plus que rarement en VBA, je continue, par habitude, à utiliser cette technique.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 12 août 2009 à 07:37
C'est bien ce que je pensais avoir compris. D'ou une nouvelle question :
Niveau performance le temps d'acces au fichier via le HDD doit être plus long qu'a la RAM, pourquoi ce choix ?
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 11 août 2009 à 21:49
Bonjour ADN56
Merci beaucoup pour tes commentaires, c'est sympa.
Pour dessiner dans un bitmap, je n'utilise pas les fonctions de dessin de VB, mais je dessine plutôt dans un fichier au format bmp 256 couleurs que je charge ensuite dans un contrôle.
Voici comment je fais. D'abord, je crée sur disque un fichier bmp vide, mais entier, c.a.d. avec ses quatre structures bmpfileheader, bmpinfoheader, palette de couleurs et bitmap data. Une fois le fichier initialisé, l'application écrit directement les pixels dans la section bitmap data du fichier. C'est possible dans le cas d'un fichier bmp, celui-ci stockant l'image sous la forme d'un tableau matriciel de pixels (raster). Une fois le dessin terminé, l'application ferme le fichier bmp avant de charger l'image dans un contrôle.
Donc, l'application écris ses pixels dans un fichier, pas à l'écran. C'est la principale différence par rapport aux fonctions de dessin de vb.
Amicalement
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 10 août 2009 à 14:05
Bonjour,
Chapeau bas Mr, je viens de tester ta source et whaouuu.
Je ne comprends cepedant comment tu fais pour dessiner dans un bipmap.
c'est la fonction ecrire pixel :
For wY = axe + 1 - (hauteur - HAUTEUR_AXE - MARGE_VER) / 2 To axe + 1 + (hauteur - HAUTEUR_AXE - MARGE_VER) / 2
If wY <> axe + 1 Then ecrirePixel(numFic, wX, wY, largeur, trailer, VERT_FONCE)
Next wY
Mais j'ai un peu de mal à la décortiquer, pourtant cela à l'air plus rapide que de dessiner directement dans la picture box, c'est pour cela que tu fais ainsi ?
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 9 févr. 2009 à 20:07
Eh bien, je peux dire que tu m'en as appris des choses en deux messages !
J'ai suivi tes conseils et supprimé les contrôles de dépassement sur les entiers en mode release ; le code est nettement plus efficace.
Je constate que j'avais une vision erronée de la version Express qui, en définitive, se révèle suffisante pour une utilisation non industrielle.
Encore merci pour tes conseils :)
Philippe
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 9 févr. 2009 à 08:28
Il faut cocher "Afficher tous les paramètres" dans la boite des Options pour accéder à toutes les options, pas besoin d'acheter une licence : les versions payantes à mon avis sont plus destinées à l'industrialisation du développement en équipe, la gratuité sert à bien faire connaitre le produit.
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 8 févr. 2009 à 21:54
J'ai commencé à examiner ton appli ; je ne connaissais pas la fonction Beep. Je n'ai pas trouvé les options avancées de compilation, c'est sans doute parce que je suis sur la version Express (je souhaite faire un tour des différentes plateformes de Visual Studio avant de faire un choix et acheter une license).
Je suis débutant en .net et en traitement du son, et je te remercie beaucoup pour tes conseils.
Amicalement
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 8 févr. 2009 à 19:49
Merci Patrice, je vais suivre tes conseils et aussi regarder ton appli.
Amicalement
Philippe
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 8 févr. 2009 à 09:57
Pas mal ton idée de générer un extrait sonore à la fréquence cliquée : moi j'avais utilisé le Beep système en lui passant la fréquence, dans mon logiciel VBWaveComp. Sinon j'ai 2 conseils : évite le Math.Pow lorsque la puissance est 2 et coche "Supprimer les contrôles de dépassement sur les entiers" dans les "options avancées de compilation" en mode Release, ça devrait aller sensiblement + vite.
13 août 2009 à 07:19
12 août 2009 à 22:53
L'importation d'image à partir d'un fichier bitmap me paraissant la seule solution pratique, j'ai, comme tu l'as évoqué, comparé les approches "mémoire" et "disque" de la gestion d'une image Windows bitmap. J'ai alors constaté que dessiner dans un fichier, en mémoire virtuelle, était plus rapide et moins gourmand en ressources que de travailler en mémoire avec des tableaux à deux dimensions. Cette bonne performance est due au fait, je pense, que les accès au disque se font seulement à l'ouverture et à la fermeture du fichier et que, dans l'intervalle, le système écrit dans le cache. Ceci est vrai à la condition que le fichier soit créé à sa taille définitive, sinon le système est susceptible d'accéder au disque en cours de travail pour ajuster la taille du fichier. Il faut donc utiliser un format Windows Bitmap non compressé, qui est à ma connaissance le seul format de fichier d'image dont on peut prévoir la taille exacte sans connaître le contenu. Ces conditions étant remplies, le fichier peut être utilisé comme mémoire vituelle (ce qui, au passage, allège considérablement les ressources de l'application).
Aujourd'hui, bien que je ne développe plus que rarement en VBA, je continue, par habitude, à utiliser cette technique.
12 août 2009 à 07:37
Niveau performance le temps d'acces au fichier via le HDD doit être plus long qu'a la RAM, pourquoi ce choix ?
11 août 2009 à 21:49
Merci beaucoup pour tes commentaires, c'est sympa.
Pour dessiner dans un bitmap, je n'utilise pas les fonctions de dessin de VB, mais je dessine plutôt dans un fichier au format bmp 256 couleurs que je charge ensuite dans un contrôle.
Voici comment je fais. D'abord, je crée sur disque un fichier bmp vide, mais entier, c.a.d. avec ses quatre structures bmpfileheader, bmpinfoheader, palette de couleurs et bitmap data. Une fois le fichier initialisé, l'application écrit directement les pixels dans la section bitmap data du fichier. C'est possible dans le cas d'un fichier bmp, celui-ci stockant l'image sous la forme d'un tableau matriciel de pixels (raster). Une fois le dessin terminé, l'application ferme le fichier bmp avant de charger l'image dans un contrôle.
Donc, l'application écris ses pixels dans un fichier, pas à l'écran. C'est la principale différence par rapport aux fonctions de dessin de vb.
Amicalement
10 août 2009 à 14:05
Chapeau bas Mr, je viens de tester ta source et whaouuu.
Je ne comprends cepedant comment tu fais pour dessiner dans un bipmap.
c'est la fonction ecrire pixel :
For wY = axe + 1 - (hauteur - HAUTEUR_AXE - MARGE_VER) / 2 To axe + 1 + (hauteur - HAUTEUR_AXE - MARGE_VER) / 2
If wY <> axe + 1 Then ecrirePixel(numFic, wX, wY, largeur, trailer, VERT_FONCE)
Next wY
Mais j'ai un peu de mal à la décortiquer, pourtant cela à l'air plus rapide que de dessiner directement dans la picture box, c'est pour cela que tu fais ainsi ?
9 févr. 2009 à 20:07
J'ai suivi tes conseils et supprimé les contrôles de dépassement sur les entiers en mode release ; le code est nettement plus efficace.
Je constate que j'avais une vision erronée de la version Express qui, en définitive, se révèle suffisante pour une utilisation non industrielle.
Encore merci pour tes conseils :)
Philippe
9 févr. 2009 à 08:28
8 févr. 2009 à 21:54
Je suis débutant en .net et en traitement du son, et je te remercie beaucoup pour tes conseils.
Amicalement
8 févr. 2009 à 19:49
Amicalement
Philippe
8 févr. 2009 à 09:57