|
freemaul
|
Posté le 21 Fév 2009 à 21:07
|
|

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
|
Posté le 21 Fév 2009 à 21:35
|
|

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
|
Posté le 21 Fév 2009 à 21:48
|
|

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
|
Posté le 21 Fév 2009 à 22:27
|
|

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
|
Posté le 23 Fév 2009 à 18:56
|
|

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
|
Posté le 23 Fév 2009 à 22:43
|
|

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 ).
Donc j'imagine que c'est bon.
|
|
SEB
|
Posté le 24 Fév 2009 à 09:32
|
|

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
|
Posté le 24 Fév 2009 à 17:39
|
|

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
|
Posté le 24 Fév 2009 à 18:50
|
|

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"
|