Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1485 connectés 

  FORUM HardWare.fr
  Programmation
  C

  performances SDL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

performances SDL

n°2091252
ptitchep
Posté le 24-07-2011 à 23:06:26  profilanswer
 

Bonjour,
 
Mon week-end  étant particulièrement palpitant, j'ai commencé à coder un pacman... pour le fun.
Ça fonctionne plutôt pas mal pour l'instant, à savoir que mon pacman peut se déplacer et manger les points. Les fantômes arriveront plus tard.
 
Le problème que j'ai concerne les perfs SDL.
J'ai un nombre d'images par secondes ridicule. Je me suis d'abord dit que j'avais fait n'importe quoi et j'ai cherché où mon programme passait le plus de temps.
Le résultat est que ce code:

Code :
  1. #include <stdio.h>
  2. #include <SDL/SDL.h>
  3. void affichage(SDL_Surface* ecran)
  4. {
  5.   //on efface l'écran:                                                                                               
  6.   Uint32 c = SDL_MapRGB (ecran->format, 0, 0, 0);
  7.   SDL_FillRect(ecran,NULL,c);
  8.   //Affichage                                                                                                         
  9.   SDL_Flip(ecran);
  10. }
  11. SDL_Surface* initialiseSDL(int largeur, int hauteur)
  12. {
  13.   SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO);
  14.   SDL_WM_SetCaption("Pacman",NULL);
  15.   return SDL_SetVideoMode(largeur, hauteur, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
  16. }
  17. void quitteSDL (SDL_Surface* ecran)
  18. {
  19.   SDL_FreeSurface(ecran);
  20.   SDL_Quit();
  21. }
  22. int main()
  23. {
  24.   SDL_Surface* ecran=initialiseSDL(1000,625);
  25.   unsigned tpsold, temps, tours = 0;
  26.   unsigned nbSec = 0;
  27.   tpsold = SDL_GetTicks();
  28.   while (nbSec < 20)
  29.     {
  30.       affichage (ecran);
  31.       ++tours;
  32.       temps = SDL_GetTicks();
  33.       if (temps >= tpsold+1000)
  34.         {
  35.           tpsold = temps;
  36.           printf("nb par seconde: %u\n",tours);
  37.           tours = 0;
  38.           nbSec++;
  39.         }
  40.     }
  41.   quitteSDL(ecran);
  42. }


fournit le résultat suivant:

Citation :

./essai  
nb par seconde: 65
nb par seconde: 64
nb par seconde: 65
nb par seconde: 65
nb par seconde: 65
nb par seconde: 65


J'ai d'abord pensé que SDL_Flip se synchronisait avec l'affichage de mon écran qui est de 60Hz (à 5 près pourquoi pas) mais la valeur augmente si je diminue la taille de ma surface ecran. Avec du 640x480, j'arrive à dépasser les 100 fps (Wahou!!!).
 
Que se passera-t-il si j'ajoute 200 sprites sur mon écran?
Qu'ai-je fait de mal pour avoir des performances aussi basses alors que je me contente d'afficher un écran noir?
 
Merci


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 24-07-2011 à 23:06:26  profilanswer
 

n°2091354
theshockwa​ve
I work at a firm named Koslow
Posté le 25-07-2011 à 14:33:10  profilanswer
 

surface hardware, remplie en soft en pixel par pixel, ca doit être ca qui te pose souci


---------------
last.fm
n°2091363
tpierron
Posté le 25-07-2011 à 14:48:45  profilanswer
 

À mon avis tu n'as pas d'accelération matérielle, sur ma machine (XP, Core Duo 2Ghz, 5 ans d'age), j'ai du 400fps.

n°2091365
ptitchep
Posté le 25-07-2011 à 14:59:22  profilanswer
 

theshockwave a écrit :

surface hardware, remplie en soft en pixel par pixel, ca doit être ca qui te pose souci


Tu parles de l'effacement de la surface écran? Dans ce cas comment modifier cela?
En supprimant l'effacement cela ne change presque rien. Le moment difficile semble être le SDL_Flip. Pourtant je pensais qu'il ne s'agissait que d'un échange de buffers...
 
 

tpierron a écrit :

À mon avis tu n'as pas d'accelération matérielle, sur ma machine (XP, Core Duo 2Ghz, 5 ans d'age), j'ai du 400fps.


Mon accélaration matérielle fonctionne, au moins avec mes applis openGL. J'ai quelques milliers de fps avec fgl_glxgears.
J'ai d'autre projets, en openGL, qui affichent en 3D de nombreux objets et cela fonctionne très bien. Cela dit ça me fait peur ton message quand on sait que j'ai un quad core de seulement 2 ans. En rentrant je testerai le code sous windows pour vérifier cela.
 
Merci.


---------------
deluser --remove-home ptitchep
n°2091395
tpierron
Posté le 25-07-2011 à 16:41:07  profilanswer
 

ptitchep a écrit :

En rentrant je testerai le code sous windows pour vérifier cela.


Ah tu n'es pas sous Windows? Sous Mac OS X, il me semble que SDL utilise aussi un truc avec rendu accéléré (la flemme de tester). Du temps où j'utilisais Linux, je me rapelle avoir eu des performances vraiment nulles. Mais bon, c'était il y a une paires d'années, ça me surprendrait que rien n'ai changé depuis...
 
Sous Windows, la SDL utilise Direct2D, que n'importe quelle carte graphique de ces 15 dernières années sait accélérer.
 
En tous les cas, pour un truc aussi simple (rendu de sprites 2D), même effectué avec le CPU, tu peux obtenir 60fps sans le moindre soucis (ie: CPU quasiment à plat).
 
Je me rappelle avoir porté fMSX 3.5.1 avec la SDL en utilisant le filtre hq2x + quelques overlay pour l'interface. Sur ma machine ça n'utilisait que 10% du CPU à 60fps (Windows donc).


Message édité par tpierron le 25-07-2011 à 16:41:30
n°2091396
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 25-07-2011 à 16:45:08  profilanswer
 

J'veux pas jouer à kikalaplusgrosse, mais avec ton programme j'obtiens ça:

 

nb par seconde: 900
nb par seconde: 1980
nb par seconde: 1952
nb par seconde: 1887
nb par seconde: 1738
nb par seconde: 10107
nb par seconde: 10884
nb par seconde: 11015
nb par seconde: 10974
nb par seconde: 10404
nb par seconde: 10887
nb par seconde: 10953
nb par seconde: 11032
nb par seconde: 10923
nb par seconde: 10430
nb par seconde: 11021
nb par seconde: 10840
nb par seconde: 10753
nb par seconde: 10962
nb par seconde: 10217

 


10 000 FPS ça va ça commence à devenir confortable :o

Message cité 1 fois
Message édité par WiiDS le 25-07-2011 à 16:47:07

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2091403
tpierron
Posté le 25-07-2011 à 17:21:46  profilanswer
 

WiiDS a écrit :

J'veux pas jouer à kikalaplusgrosse, mais avec ton programme j'obtiens ça:  
 
10 000 FPS ça va ça commence à devenir confortable :o


 
 [:cupra] Taille du pén... Spec du système?  :o  (notamment quel OS)
 
Edit: Arf, j'avais oublié le lien dans ton profil...
 
Processeur : Intel i5-2500k @ 4.6Ghz (46x100)
Mémoire vive : 8Go Corsair Vengeance DDR3 CL9 (CMZ8GX3M2A1866C9)
Carte graphique : nVidia Geforce GTX 570


Message édité par tpierron le 25-07-2011 à 17:26:47
n°2091416
ptitchep
Posté le 25-07-2011 à 18:30:58  profilanswer
 

Moi c'est:
Quad core Jenesaispluscb Ghz
4Go de Ram
ATI radeon 4870HD
 
Donc bon, pour afficher un écran noir...
 
Je suis toujours au taf donc je n'ai pas encore testé sous Windows.
Est-ce qu'il est possible que la 3D soit accélérée mais pas la 2D sous Linux?


---------------
deluser --remove-home ptitchep
n°2091421
Terminapor
I'll see you rise.
Posté le 25-07-2011 à 19:23:08  profilanswer
 

Il me semble que la SDL ne gère pas du tout l'accélération :spamafote:

n°2091473
ptitchep
Posté le 25-07-2011 à 23:20:35  profilanswer
 

En fait je ne peux pas tester sous Windows.
Je n'ai rien pour compiler vu que Windows ne me sert à rien qu'à lancer quelques jeux.
 
WiiDs tu as quel OS?
Parce que si mon code (et quel code!) tourne à cette vitesse chez toi, je vais mettre le problème sur le dos de mon système et tourner la page.
Après tout, je ne faisais qu'un pacman pour m'occuper un week end de solitude et je ne le terminerai sans doute jamais (si si j'ai une vie d'habitude).
 
Merci pour vos réponses.  :)


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 25-07-2011 à 23:20:35  profilanswer
 

n°2091527
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 26-07-2011 à 11:49:03  profilanswer
 

ptitchep a écrit :

En fait je ne peux pas tester sous Windows.
Je n'ai rien pour compiler vu que Windows ne me sert à rien qu'à lancer quelques jeux.
 
WiiDs tu as quel OS?
Parce que si mon code (et quel code!) tourne à cette vitesse chez toi, je vais mettre le problème sur le dos de mon système et tourner la page.
Après tout, je ne faisais qu'un pacman pour m'occuper un week end de solitude et je ne le terminerai sans doute jamais (si si j'ai une vie d'habitude).
 
Merci pour vos réponses.  :)


J'ai Windows 7 x64 mais je trouve quand même ton problème bizzare. Si tu obtiens d'excellentes performances avec glxgears c'est étrange que tu n'aies que 60fps, je vais tester avec une VM Archlinux pour voir si je peux reproduire ton problème :o
 
Sinon comme disait un intervenant plus haut, visiblement la SDL n'utilise en effet pas l'accélération matérielle. Non seulement je me coucherais moins con, mais j'ai également appris qu'il existe que la SFML elle utilise bel et bien l'accélération matérielle si ça t'intéresse, et porter ton code dessus ne devrait pas être trop compliqué :jap:


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2091534
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 26-07-2011 à 12:57:44  profilanswer
 

Bon bah sur Arch j'ai bien 1800+ FPS et encore je suis sur une VM :/ Je miserais donc sur un problème de ton OS


Message édité par WiiDS le 26-07-2011 à 12:57:58

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2091788
ptitchep
Posté le 27-07-2011 à 17:18:45  profilanswer
 

C'est possible étant donné que c'est ma première Gentoo.
Il me manque pas mal de choses encore (mais pas l'accélération 3D).
 
De toute façon je vais devoir refaire mon système. Je verrai si  quelque chose change.
 
J'ai aussi entendu parlé de SFML, je vais tester.


---------------
deluser --remove-home ptitchep
n°2091890
404 Not Fo​und
Posté le 28-07-2011 à 09:08:43  profilanswer
 

Utilise OpenGL :)

Code :
  1. #include <stdio.h>
  2. #include <SDL/SDL.h>
  3. #include <SDL/SDL_opengl.h>
  4. void affichage(int step)
  5. {
  6.   //on efface l'écran:                                                                                               
  7. glClearColor(0,0,0,1);
  8. glClear(GL_COLOR_BUFFER_BIT);
  9. // on dessine un triangle
  10. glBegin(GL_TRIANGLES);
  11. glColor3f(1,0,0);
  12. glVertex3f(100.0f+(0.1*step), 200.0f, 0.0f);
  13. glColor3f(0,1,0);
  14. glVertex3f(200.0f+(0.1*step), 200.0f, 0.0f);
  15. glColor3f(0,0,1);
  16. glVertex3f(150.0f+(0.1*step), 125.0f, 0.0f);
  17. glEnd( );
  18.   //Affichage                                                                                                         
  19.   SDL_GL_SwapBuffers();
  20. }
  21. SDL_Surface* initialiseSDL(int largeur, int hauteur)
  22. {
  23. SDL_Surface *ecranptr=0;
  24.   SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO);
  25.   SDL_WM_SetCaption("Pacman",NULL);
  26. SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8);
  27. SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8);
  28. SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8);
  29. SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,8);
  30. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
  31. ecranptr=SDL_SetVideoMode(largeur, hauteur, 32, SDL_OPENGL);
  32. glViewport(0,0,largeur,hauteur);
  33. glMatrixMode(GL_PROJECTION);
  34. glLoadIdentity();
  35. glOrtho(0,largeur,hauteur,0,-1,1);
  36. glMatrixMode(GL_MODELVIEW);
  37. glLoadIdentity();
  38.   return ecranptr;
  39. }
  40. void quitteSDL (SDL_Surface* ecran)
  41. {
  42.   SDL_FreeSurface(ecran);
  43.   SDL_Quit();
  44. }
  45. int main()
  46. {
  47.   SDL_Surface* ecran=initialiseSDL(1000,625);
  48.   unsigned tpsold, temps, tours = 0;
  49.   unsigned nbSec = 0;
  50.   tpsold = SDL_GetTicks();
  51.   while (nbSec < 5)
  52.     {
  53.       affichage (tours);
  54.       ++tours;
  55.       temps = SDL_GetTicks();
  56.       if (temps >= tpsold+1000)
  57.         {
  58.           tpsold = temps;
  59.           printf("nb par seconde: %u\n",tours);
  60.           tours = 0;
  61.           nbSec++;
  62.         }
  63.     }
  64.   quitteSDL(ecran);
  65. return(0);
  66. }


Sur ma machine (C2D@4.2G, NV9800GT, driver proprio), ça passe de +-800 à +-6000fps.

n°2091928
theshockwa​ve
I work at a firm named Koslow
Posté le 28-07-2011 à 12:56:23  profilanswer
 


 
Ca fait un moment que le mode immédiat aurait du disparaître d'OpenGL


---------------
last.fm
n°2091948
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 28-07-2011 à 14:14:32  profilanswer
 

404 Not Found a écrit :

Utilise OpenGL :)
[/cpp]
Sur ma machine (C2D@4.2G, NV9800GT, driver proprio), ça passe de +-800 à +-6000fps.


Et moi je chute a 5000fps, comme quoi :o


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2092976
ptitchep
Posté le 02-08-2011 à 23:16:30  profilanswer
 

J'ai testé SFML.
 
Je n'ai pas mesuré mais les performances n'ont rien à voir.
Et c'est du C++.
Je n'ai testé ni le son ni openGL pour l'instant mais je sens que ça va me plaire. :)
 
Merci
 


---------------
deluser --remove-home ptitchep

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  performances SDL

 

Sujets relatifs
interaction SDL et directXDomaine d'application compilateur SDL
Performances champ de type tableauProblème avec SDL_gfx : *.h manquants [RESOLU]
[C++] Fenêtre SDL ne s'affiche pas [RESOLU]recrutement C/SDL
dessiner des graphes en C++ avec SDL[SDL] meilleure méthode?
[SDL] Hésitation de codageSDL et xcode
Plus de sujets relatifs à : performances SDL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR