Accueil > Forum > > > > Vitesse d'affichage
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); *************************************
|
|
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|