Lenteur

Signaler
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
J'ai fais une petite DLL de graphisme 2D (vous aller me dire que c'est rudimentaire. Je le sais!). Elle n'utilise aucune fonction déja toute faite (sauf les fonctions des DLL de Windows bien sûre). Mais j'ai un problème écrasant. C'est lent. Très lent et sourtout quand il y a beaucoup de chose sur l'interface. J'utilise la fonction SetPixel en boucle pour afficher les pixels (bien sûre) mais lors que l'on grossie la fenetre ou que certaine superficie son grande, le nombre de FPS chut à 1 ou 2. En gros, j'aimerais savoir si vous connaissez une meilleur méthode pour afficher les pixels sans faire ramé l'ordinateur. Le codage général de la boucle d'affichage est:
while(LongeurTotal >= LongeurCourante)
{
(calcule des sinus cosinus et tous le reste)
...
SetPixel((hDC en mémoire), PositionX, PositionY, RGB(Rouge, Vert, Bleue));
...
}
avant il y a bien sur la création de l'interface:
CreateCompatibleBitmap(hBmp);
CreateCompatibleDC... ect.
et après il y a la supression des objets:
DeleteObject(hBmp);
DeleteDC((hDC en mémoire))... ect.

En gros dans un programme sa donne le résultat suivant:
switch(message)
{
case WM_PAINT:
g2dBeginPaint (la fonction qui créé l'interface)
g2dDrawLine (la fonction qui créé les pixels)
g2dEndPaint (la fonction qui supprime les objets)
break;
}

Sa aurais été plus simple de mêtre les sources sur internet mais je suis au j'ai pas internet chez moi et je parle des ordi du collège.

5 réponses

Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
Je n'ai pas fait de moteur 2d mais recalculé les sinus et cosinus ca prend enormement de temps mieux vaut faire un tableau

de float ... pour une precision extreme on peut faire 360 * 4 = 1440 ce qui est pas enorme
rrk275
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Au lieu de boucler sur SetPixel(), tu peux utiliser BitBlt().
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Oui la fonction setpixel est horriblement lente fait plutot avec
BitBlt() et les compatibles bitmaps ou DIB regarde la source
http://www.cppfrance.com/code.aspx?id=23921 l'auteur fait une rotation
a une image sans passer par setpixel juste en travaillant avec des
pointeurs (le plus rapide)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oui mais BitBlt est fait pour afficher les pixel a l'écran non? C'est SetPixel qui les crées. Je ne peut pas juste utiliser BitBlt c'est pas fait pour créé des pixels ça non?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Nan pas du tout, je m y connais pas assez pour pas dire de connerie mais bitblt sert a copier des Bits d'un DC a un autre DC.

Et ce n'est pas SetPixel ki les créés ( heureusement car Setpixel est tres lente comme API c'est au minimum 10 fois plus lent).

Un moteur graphique avec SetPixel est inconcevable.

Meme pour afficher un simple spectrographe (d'une seule couleur)
j'ai du passer par les DIB, meme pour ca SetPixel est trop lente.