kururin
Messages postés9Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention 1 avril 2006
-
7 mai 2004 à 11:01
cs_bbear
Messages postés92Date d'inscriptionjeudi 24 novembre 2005StatutMembreDernière intervention29 mai 2008
-
11 avril 2006 à 16:01
Bonjour
Je suis en train de créer en jeu d'échec sous vc++ en mode graphique. Tout marche correctement...mais j'ai un probleme au niveau de l'affichage...c'est trop lent !
Sur mon pc, tout se déroule parfaitement bien, mais lorsque je lance l'application sous une machine plus ancienne, l'affichage se beaucoup plus lentement. Par exemple, lorsque je clique sur une piece du jeu, je dois attendre 1 ou 2 secondes avant que celle-ci ne soit sélectionnée.
J'utilise back-buffer (afin de pouvoir tout afficher d'un coup).
J'aurais donc voulu savoir s'il existe un moyen d'accélérer l'affichage.
kururin
Messages postés9Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention 1 avril 2006 7 mai 2004 à 17:02
Merci pour ta reponse si rapide... (d'ailleurs il me semble que je me suis un peu inspiré de ton jeu d'échecs...si c bien toi)
Voici une partie du source :
A chaque fois que je veux redessiner l'échiquier, je dessine d'abord dans le back buffer, puis InvalidateRect pour appeler WM_PAINT et j'utilise BitBlt pour copier ce qui se trouve dans le back buffer sur l'écran.
Note : je crée au passage un masque pour afficher mes pieces sur l'échiquier et rendre la couleur de fond transparente.
////////////////////////
case WM_PAINT :
hDC=BeginPaint(hWnd,&paintst);
// on affiche ce qui se trouve dans le backbuffer
BitBlt(hDC, 80, 100, TAILLE_CASE * 6, TAILLE_CASE * 6, hMemDC, 0, 0, SRCCOPY);
...
...
EndPaint(hWnd, &paintst);
cs_GoldenEye
Messages postés527Date d'inscriptionvendredi 14 septembre 2001StatutMembreDernière intervention 6 octobre 20084 7 mai 2004 à 17:25
Pas de chance je ne maîtrise pas le Win32 graphique...
Quoi qu'il en soit ce n'est pas normal.
Déjà tu remplaces tes if if if par un switch ça ira peut être mieux.
Je pense que ta lenteur vient du chargement du fichier image à chaque coup.
Tu devrais rajouter une fonction init qui charge toutes les images dans un tableau de HBITMAP. Idem pour la création des masques. Pas la peine de les créer-détruire à chaque mouvement.
Essaye avec ça et revient si c'est toujours aussi lent
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 8 mai 2004 à 15:12
A chaque fois tu recalcules des bitmaps ??
sinon je voufrais juste de faire remarquer que quand tu fais SelectObject dans CreateBitmapMask, et bien avant de detruire ton hdcMem et hdcMem2, il faut DESELECTIONNER les bimtaps
Pourquoi dans ton WM_PAINT tu fais DeleteDC(hDC); ??
ce n'est pas a toi de la faire puisque tu appelles EndPaint
kururin
Messages postés9Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention 1 avril 2006 10 mai 2004 à 09:16
Extra... J'ai fait une fonction qui charge tous les bitmaps dans un tableau et ca fonctionne nettement mieux ainsi...donc merci beaucoup.
Mais j'ai un autre probleme maintenant...et je sais pas pourquoi : lorsque j'affiche le premier pion blanc (par exemple), celui ci s'affiche correctement mais tous les suivants s'affichent avec un fond noir (meme s'ils se trouvent sur une case blanche). Je n'avais pas ce probleme avant.
Autre question : JDCjcd, tu me dis de DESELECTIONNER les bitmaps...peux tu me donner la commande pour le faire (et oui...je debute la dedans :))) et m'expliquer pourquoi ?
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 10 mai 2004 à 19:14
En fait c'est en rapport avec le logique du GDI.
Voila, il faut une HDC pour effecteuer n'importe quelle operation GDI. Il existe des objets spesifiche a une HDC, comme une bitmap
Dond des que tu fais SelectObject, tu assigne une bitmap a ton HDC, mais cette fonction te retourne l'ancienne bitmap (une bimtap de taille 1x1 monochrome)
donc il faut faire :
old = SelectObject(hdc,bmp);
puis apres avant de detruire ton HDC, tu doit avoir le MEME exactement HDC que lors de la creation, donc il faut deselectionner bmp et reselectionner old
Pour cela c'est tres simple :
SelectObject(hdc,old);
Cela va deselectionner automatiquement bmp
ensuite tu auras les droits de detruire bmp et hdc
kururin
Messages postés9Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention 1 avril 2006 11 mai 2004 à 19:35
Merci pour ces explications qui m'aident un peu mieux à comprendre tout ca.
Mais malgres cela, j'ai toujours mon probleme d'affichage décrit précédemment. J'ai beau faire comme tu m'as dit, rien y fait.
Je vais surement etre lourd, mais pourrais tu me préciser où dans mon programme il serait judicieux de déselectionner les bmp et de les supprimer.
Sinon je me debrouillerais et je finirais bien par trouver...enfin j'espere.
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 12 mai 2004 à 15:41
Pourquoi tu appelles fois BitBlt ??
*****************************
BitBlt(hMemDC, c * TAILLE_CASE, l * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE, hdcMem, 0, 0, SRCAND);
SelectObject(hdcMem, hBmp);
BitBlt(hMemDC, c * TAILLE_CASE, l * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE, hdcMem, 0, 0, SRCPAINT);
*************************************
pourquoi ne pas faire tou simplement :
************************************
BitBlt(hMemDC, c * TAILLE_CASE, l * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE, hdcMem, 0, 0, SRCCOPY);
*************************************