performances SDL

performances SDL - C - Programmation

Marsh Posté le 24-07-2011 à 23:06:26    

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
Reply

Marsh Posté le 24-07-2011 à 23:06:26   

Reply

Marsh Posté le 25-07-2011 à 14:33:10    

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


---------------
last.fm
Reply

Marsh Posté le 25-07-2011 à 14:48:45    

À 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.

Reply

Marsh Posté le 25-07-2011 à 14:59:22    

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
Reply

Marsh Posté le 25-07-2011 à 16:41:07    

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
Reply

Marsh Posté le 25-07-2011 à 16:45:08    

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
Reply

Marsh Posté le 25-07-2011 à 17:21:46    

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
Reply

Marsh Posté le 25-07-2011 à 18:30:58    

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
Reply

Marsh Posté le 25-07-2011 à 19:23:08    

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

Reply

Marsh Posté le 25-07-2011 à 23:20:35    

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
Reply

Marsh Posté le 25-07-2011 à 23:20:35   

Reply

Marsh Posté le 26-07-2011 à 11:49:03    

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
Reply

Marsh Posté le 26-07-2011 à 12:57:44    

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
Reply

Marsh Posté le 27-07-2011 à 17:18:45    

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
Reply

Marsh Posté le 28-07-2011 à 09:08:43    

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.

Reply

Marsh Posté le 28-07-2011 à 12:56:23    


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


---------------
last.fm
Reply

Marsh Posté le 28-07-2011 à 14:14:32    

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
Reply

Marsh Posté le 02-08-2011 à 23:16:30    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed