begin process at 2012 05 30 23:03:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Graphique

 > 

Vitesse d'affichage


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Vitesse d'affichage

vendredi 7 mai 2004 à 11:01:28 | Vitesse d'affichage

kururin

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

vendredi 7 mai 2004 à 16:16:53 | Re : Vitesse d'affichage

GoldenEye

Quelle est la librairie graphique ?
Montre nous un peu le code
Optimiser, c'est bien, déboguer c'est mieux
vendredi 7 mai 2004 à 17:02:43 | Re : Vitesse d'affichage

kururin

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
vendredi 7 mai 2004 à 17:25:02 | Re : Vitesse d'affichage

GoldenEye

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
vendredi 7 mai 2004 à 18:06:48 | Re : Vitesse d'affichage

kururin

OK, j'vais suivre tes conseils et on verra bien...

Merci en tout cas.
samedi 8 mai 2004 à 15:12:39 | Re : Vitesse d'affichage

JCDjcd

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
lundi 10 mai 2004 à 09:16:48 | Re : Vitesse d'affichage

kururin

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.
lundi 10 mai 2004 à 19:14:45 | Re : Vitesse d'affichage

JCDjcd


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
mardi 11 mai 2004 à 19:35:55 | Re : Vitesse d'affichage

kururin

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
mercredi 12 mai 2004 à 15:41:29 | Re : Vitesse d'affichage

JCDjcd


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);
*************************************

1 2

Cette discussion est classée dans : jeu, affichage, vitesse


Répondre à ce message

Sujets en rapport avec ce message

Régler vitesse affichage Konsole (Linux) [ par bouba ] Bonjour, je suis en train de réaliser un chronomètre sous la Konsole linux. Je souhaiterais raffraichir celui-ci tout les millième de seconde, le prob Affichage durant un temps donné [ par TeamSo6 ] Voilà je suis en train de réaliser un jeu memory (le jeu avec les paires qu'il faut retourner), et j'aimerais savoir comment faire pour afficher un ta Vitesse d'affichage en fonction de la vitesse du processeur... [ par Tibabou ] Bonjour/soir à tous,Les pièces d'un tétris ne tombent pas plus vite sur un 3,2 Ghz que sur un 1,2 Ghz...Il en est de même pour tous les jeux.J'aimerai affichage graphique jeu des allumettes [ par Masshysteria63 ] Je suis en train de programmer le jeu des allumettes, identique à celui de fort boyard) et je ne vois pas comment faire pour la partie graphique du pr affichage 3D MFC [ par gestual ] bonjour j'ai pour projet de realiser un rendu 3D avec MFC et seulement MFC (pas d'openGL) et je sais faire l'ouverture de fichier la projection les om Jeu à la Worms [ par norton ] Hello, j'aimerai essayer de coder un petit jeu à la worms mais je sais pas vraimment comment m'y prendre avec la map. Si vous avez des idées, je suis Simulation clavier mode graphique? [ par Smerek ] Bonjour a tous, je cherche désespérément comment simuler le clavier sur un jeu.Mon but est qu en lancant mon programme, le jeu se lance (ca ca va), et Affichage Fltk [ par tomtom187 ] Bonjour, Je commence tout juste a apprendre le C++ et dans le cadre d'un stage, on me demande de dévellopper une interface graphique avec FLTK. Je sui minimax-jeu des allumettes [ par Masshysteria63 ] Je suis en train de programmer le jeu des allumettes et il me reste à régler le problème intelligence de l'ordi, donc voilà pkoi je souhaite utiliser intelligence artificielle pour jeu 2d à la mario bros [ par StrikerFred ] bonjour, je fais un jeu 2d mais avec une vue style mario (profil)donc y'aura des ennemis, et j'aimerais qu'ils se dirigent vers le héros, cad qu'ils a


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales