Vitesse d'affichage

kururin Messages postés 9 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 1 avril 2006 - 7 mai 2004 à 11:01
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 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.

Merci d'avance

10 réponses

cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
7 mai 2004 à 16:16
Quelle est la librairie graphique ?
Montre nous un peu le code
Optimiser, c'est bien, déboguer c'est mieux
0
kururin Messages postés 9 Date d'inscription jeudi 5 juin 2003 Statut Membre Derniè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);

SelectObject(hMemDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(hDC);
/////////////////////////

void Dessine(HWND hWnd, GAME * g)
{
int l, c ;
HDC hDC2 ;
char *bmp ;

hDC2 = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hDC2);
hMemBmp = CreateCompatibleBitmap(hDC2, 294, 294);
SelectObject(hMemDC, hMemBmp);

brush = brush_impair ;
for(l = 0 ; l < 6 ; l++)
{
for(c = 0 ; c < 6 ; c++)
{
SelectObject(hMemDC, brush) ;
Rectangle(hMemDC, c * TAILLE_CASE, l * TAILLE_CASE, (c + 1) * TAILLE_CASE, (l + 1) * TAILLE_CASE) ;

if(g->plato[l][c] != VIDE)
{
if(g->plato[l][c] == TOUR)
bmp = "tb.bmp" ;
if(g->plato[l][c] == -TOUR)
bmp = "tn.bmp" ;
if(g->plato[l][c] == CAVAL)
bmp = "cb.bmp" ;
if(g->plato[l][c] == -CAVAL)
bmp = "cn.bmp" ;
if(g->plato[l][c] == FOU)
bmp = "fb.bmp" ;
if(g->plato[l][c] == -FOU)
bmp = "fn.bmp" ;
if(g->plato[l][c] == DAME)
bmp = "db.bmp" ;
if(g->plato[l][c] == -DAME)
bmp = "dn.bmp" ;
if(g->plato[l][c] == ROI)
bmp = "rb.bmp" ;
if(g->plato[l][c] == -ROI)
bmp = "rn.bmp" ;
if(g->plato[l][c] == PION)
bmp = "pb.bmp" ;
if(g->plato[l][c] == -PION)
bmp = "pn.bmp" ;

PlacePiece(hMemDC, bmp, l, c) ;
}brush (brush brush_pair) ? brush_impair : brush_pair ;
}brush (brush brush_pair) ? brush_impair : brush_pair ;
}
}

/////////////////////////////////////
void PlacePiece(HDC hMemDC, char * filename, int l, int c)
{
HDC hDC, hdcMem ;
HBITMAP hBmp, hBmpMask ;
BITMAP bm ;

hBmp=(HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hBmpMask = CreateBitmapMask(hBmp, RGB(0, 255, 0));
hdcMem = CreateCompatibleDC(hMemDC) ;
SelectObject(hdcMem, hBmpMask);

GetObject(hBmp, sizeof(bm), &bm) ;

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);
}
////////////////////////////////////

HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
{
HDC hdcMem, hdcMem2;
HBITMAP hbmMask;
BITMAP bm;

GetObject(hbmColour, sizeof(BITMAP), &bm);

hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);

hdcMem = CreateCompatibleDC(0);
hdcMem2 = CreateCompatibleDC(0);

SelectObject(hdcMem, hbmColour);
SelectObject(hdcMem2, hbmMask);

SetBkColor(hdcMem, crTransparent);

BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);

DeleteDC(hdcMem);
DeleteDC(hdcMem2);
return hbmMask;
}

J'espere que c'est assez clair...

Merci
0
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
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

Optimiser, c'est bien, déboguer c'est mieux
0
kururin Messages postés 9 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 1 avril 2006
7 mai 2004 à 18:06
OK, j'vais suivre tes conseils et on verra bien...

Merci en tout cas.
0

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

Posez votre question
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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
0
kururin Messages postés 9 Date d'inscription jeudi 5 juin 2003 Statut Membre Derniè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 ?

Voici le nouveau code :

//////////////////////////////////
void ChargePieces()
{
hBmpPiece[0] = (HBITMAP)LoadImage(NULL, "tb.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[1] = (HBITMAP)LoadImage(NULL, "cb.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[2] = (HBITMAP)LoadImage(NULL, "fb.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[3] = (HBITMAP)LoadImage(NULL, "rb.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[4] = (HBITMAP)LoadImage(NULL, "db.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[5] = (HBITMAP)LoadImage(NULL, "pb.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[6] = (HBITMAP)LoadImage(NULL, "tn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[7] = (HBITMAP)LoadImage(NULL, "cn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[8] = (HBITMAP)LoadImage(NULL, "fn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[9] = (HBITMAP)LoadImage(NULL, "rn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[10] = (HBITMAP)LoadImage(NULL, "dn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
hBmpPiece[11] = (HBITMAP)LoadImage(NULL, "pn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;
}
///////////////////////////////////////////

void PlacePiece(HDC hMemDC, int piece, int l, int c)
{
HDC hdcMem ;
HBITMAP hBmp, hBmpMask ;

hBmp = hBmpPiece[piece] ;
hBmpMask = CreateBitmapMask(hBmp, RGB(0, 255, 0));
hdcMem = CreateCompatibleDC(hMemDC) ;
SelectObject(hdcMem, hBmpMask);

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);
DeleteObject(hdcMem) ;
DeleteObject(hBmpMask) ;
}

///////////////////////////////////////////////
HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
{
HDC hdcMem, hdcMem2;
HBITMAP hbmMask;
BITMAP bm;

GetObject(hbmColour, sizeof(BITMAP), &bm);

hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);

hdcMem = CreateCompatibleDC(0);
hdcMem2 = CreateCompatibleDC(0);

SelectObject(hdcMem, hbmColour);
SelectObject(hdcMem2, hbmMask);

SetBkColor(hdcMem, crTransparent);

BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);

DeleteDC(hdcMem);
DeleteDC(hdcMem2);
return hbmMask;
}
//////////////////////////////////////////////
void Dessine(HWND hWnd, GAME * g)
{
int l, c ;
HDC hDC2 ;

hDC2 = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hDC2);
hMemBmp = CreateCompatibleBitmap(hDC2, 294, 294);
SelectObject(hMemDC, hMemBmp);

brush = brush_impair ;
for(l = 0 ; l < 6 ; l++)
{
for(c = 0 ; c < 6 ; c++)
{
SelectObject(hMemDC, brush) ;
Rectangle(hMemDC, c * TAILLE_CASE, l * TAILLE_CASE, (c + 1) * TAILLE_CASE, (l + 1) * TAILLE_CASE) ;

if(g->plato[l][c] != VIDE)
{
if(g->plato[l][c] == TOUR)
PlacePiece(hMemDC, 0, l, c) ;
if(g->plato[l][c] == -TOUR)
PlacePiece(hMemDC, 6, l, c) ;
if(g->plato[l][c] == CAVAL)
PlacePiece(hMemDC, 1, l, c) ;
if(g->plato[l][c] == -CAVAL)
PlacePiece(hMemDC, 7, l, c) ;
if(g->plato[l][c] == FOU)
PlacePiece(hMemDC, 2, l, c) ;
if(g->plato[l][c] == -FOU)
PlacePiece(hMemDC, 8, l, c) ;
if(g->plato[l][c] == DAME)
PlacePiece(hMemDC, 4, l, c) ;
if(g->plato[l][c] == -DAME)
PlacePiece(hMemDC, 10, l, c) ;
if(g->plato[l][c] == ROI)
PlacePiece(hMemDC, 3, l, c) ;
if(g->plato[l][c] == -ROI)
PlacePiece(hMemDC, 9, l, c) ;
if(g->plato[l][c] == PION)
PlacePiece(hMemDC, 5, l, c) ;
if(g->plato[l][c] == -PION)
PlacePiece(hMemDC, 11, l, c) ;
}brush (brush brush_pair) ? brush_impair : brush_pair ;
}brush (brush brush_pair) ? brush_impair : brush_pair ;
}
}
/////////////////////////////////////////////

Voila....et vraiment merci pour vos reponses !

K.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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
0
kururin Messages postés 9 Date d'inscription jeudi 5 juin 2003 Statut Membre Derniè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.

Merci
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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);
*************************************
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
11 avril 2006 à 16:01
pour la transparence
0
Rejoignez-nous