Lenteur

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 12 déc. 2005 à 16:24
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 13 déc. 2005 à 17:07
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

rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
12 déc. 2005 à 17:23
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
12 déc. 2005 à 17:49
Salut,

Au lieu de boucler sur SetPixel(), tu peux utiliser BitBlt().
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
12 déc. 2005 à 17:53
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)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 déc. 2005 à 19:34
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
13 déc. 2005 à 17:07
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.
0
Rejoignez-nous