[C++] SDL OPENGL - problème de frame rate

freemaul Message lu Posté le 21 Fév 2009 à 21:07 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Bonsoir, j'aissai de créer mon moteur 2d en C++ en utilisant la SDL et OpenGl, OpenGL pour povoir ensuite passer à un moteur 3D, mais voila quand testant mon moteur j'obtien un jolie frame rate de 60Fps, alors que je n'affichais qu'une pauvre image de 100*100pixels.

Et j'ai donc voulu tester le code tout bête suivant (ici d'un tuto sur la sdl) et j'obient aussi un FPS de 60 :

Code :
#include <cstdlib>
#include <iostream>
#include "windows.h"
#include "GL/GL.h"
#include "SDL/SDL.h"
using namespace std;
#pragma comment(lib,"SDL.lib")
#pragma comment(lib,"SDLmain.lib")
#pragma comment(lib,"OpenGL32.Lib")

void affiche()
{
   //Mettre a zero le tampon de couleurs
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();

   SDL_GL_SwapBuffers();
}

int main(int argc,char **argv)
{
	const int WIDTH=800;
	const int HEIGHT=600;
	SDL_Event event;
    SDL_Surface *screen;
    int done = 0;
    int fps, last,now;


    //Initialisation
    if(SDL_Init(SDL_INIT_VIDEO)!=0) {
	   cerr << "Probleme pour initialiser SDL: " << SDL_GetError() << endl;
	   return EXIT_FAILURE;
    }

    //Mettre un titre à la fenetre
    SDL_WM_SetCaption("Pong Version 1.0", NULL);

    //Double tampon
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);

    //Ouvrir une fenetre
    screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL);
    if(screen==NULL)
      	done = 1;
    //Remettre a zero la matrice de projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // Mettre les matrices en place pour une vue orthogonale
    glOrtho(0,WIDTH,HEIGHT,0,-1,1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    last = SDL_GetTicks()/1000;
    fps = 0;

	//Boucle generale
    while(!done)
    {
        //Traiter les evenements
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					done=1;
					break;
  				case SDL_KEYUP:
					if(event.key.keysym.sym==SDLK_q)
						done=1;
					break;
				default:
					break;
			}
		}
    fps++;

    now = SDL_GetTicks()/1000;
    if(now!=last)
	    {
	    cout << "FPS: " << fps/(now-last) << endl;
	    last = now;
	    fps = 0;
	    }

    affiche();
    }

    SDL_Quit();
	return 0;
}


Je compile avec Visual C++ 2008 Express, et la j'avoue ne plus savoir ou regarder pour régler ce problème, alors que dans le tutoriel il atteint un Fps de plus de 500,

vous avez une idée ??
"La vie n'a pas de prix, mais elle coûte chère"
Lionhearths Message lu Posté le 21 Fév 2009 à 21:35 Bulle
Avatar de Lionhearths
Explorateur

Messages : 41
GCPoints : 13893
SDL force de base la synchronisation verticale (d'où le 60FPS).
Si tu veux connaître les FPS réels, tu peux désactiver la synchronisation verticale depuis les options avancées de ta carte graphique si jamais ta carte le permet.
freemaul Message lu Posté le 21 Fév 2009 à 21:48 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
OK merci,
Mais du coup je me rend pas compte si c'est une bonne chose de le laisser ou non ?
et deplus comment faire pour désactiver la sonchro vertical directement dans le code c++ ?
"La vie n'a pas de prix, mais elle coûte chère"
SEB Message lu Posté le 21 Fév 2009 à 22:27 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Avec la sdl je ne sais pas trop mais il y a une chose à laquelle il faut faire attention lorsque l'on fait de la 3D c'est les cout !!! ca ca peut te tomber un fps tres rapidement !!
NextGine : 3D games engine
Nombre de lignes actuel : 77683
freemaul Message lu Posté le 23 Fév 2009 à 18:56 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
J'obient la même vistesse de rafraichissement sans aucun cout ni console.
Personne n'a d'idée ? je séche complet là


Edit : j'ai en effet pu désactiver la synchro verticale depuis le panneau d'administration nvidia, mais par défault la sonchro verticale est sur : "utiliser les paramètres de l'application 3d", donc il doit bien y avoir un moyen de selectionner le mode dans le code sdl ou opengl , mais pas moyen de trouver sur le net pour l'instant


ReEdit (dsl ^^), j'ai finalement trouver ce code, mais il à l'air un peu tiré par les cheveux, tampis je m'en conteterais :
Code :
typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int );
PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0;

void setVSync(int interval=1)
{
  const char *extensions = glGetString( GL_EXTENSIONS );

  if( strstr( extensions, "WGL_EXT_swap_control" ) == 0 )
    return; // Error: WGL_EXT_swap_control extension not supported on your computer.\\n");
  else
  {
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress( "wglSwapIntervalEXT" );

    if( wglSwapIntervalEXT )
      wglSwapIntervalEXT(interval);
  }
}

Dernière édition le 23 Fév 2009 à 20:23
"La vie n'a pas de prix, mais elle coûte chère"
Lionhearths Message lu Posté le 23 Fév 2009 à 22:43 Bulle
Avatar de Lionhearths
Explorateur

Messages : 41
GCPoints : 13893
La fonction utilisée est une extension OpenGL, donc le code semble bon (même si je trouve perso que les extensions OpenGL sont bordéliques et que c'est super moche niveau code :absurd: ).
Donc j'imagine que c'est bon.
SEB Message lu Posté le 24 Fév 2009 à 09:32 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Et ce code marche pour désactiver la synchro verticale?

Ca me parrait bizard comme methode pour la désactiver (mem si je n'ai jamais vraiment essayé) c'est pour ca que je demande :D
NextGine : 3D games engine
Nombre de lignes actuel : 77683
Darktib Message lu Posté le 24 Fév 2009 à 17:39 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Ben il peut aussi modifier la SDL puis recompiler :baf:

Sinon c'est bizarre comme méthode, mais si ca marche...
freemaul Message lu Posté le 24 Fév 2009 à 18:50 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Ben c'est bizard comme tu dit oui, mais je n'ai pas trouvé d'autre moyen, et cela marche trés bien.
Donc en attendant mieu cela me suffira
"La vie n'a pas de prix, mais elle coûte chère"
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0803 secondes