Hasta ahora estaba haciendo algunas pequeñas cosillas con SDL en un ordenador con windows. Ahora, uno de esos pequeños programas lo compilé bajo Linux y me dio la impresión de que iba mucho más lento, así que armé el siguiente programa para comprobar:
El mismo código, sin tocar nada, lo he compilado tanto en windows como linux, en el mismo ordenador (tengo los dos sistemas instalados). El ordenador es un Intel core 2 quad con 4 GB de RAM y una gráfica integrada Intel (sí, necesito una mejor).
El rendimiento del programa me sorprendió:
- Código: Seleccionar todo
#include <SDL/SDL.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
SDL_Surface *pantalla, *fondo, *pelota, *tmp;
SDL_Rect pos_pelota, pos_anterior;
SDL_Event eventos;
bool salir;
int ciclos, t_inicial;
int velx, vely;
if(SDL_Init(SDL_INIT_VIDEO) < 0){
cout << "No se puede iniciar SDL" << endl;
cout << "Error SDL: " << SDL_GetError() << endl;
return 1;
}
// pantalla = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
pantalla = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
if(pantalla == NULL){
cout << "Error creando la pantalla" << endl;
cout << "Error SDL: " << SDL_GetError() << endl;
SDL_Quit();
return 1;
}
tmp = SDL_LoadBMP("../fondo.bmp");
fondo = SDL_DisplayFormat(tmp);
SDL_FreeSurface(tmp);
tmp = SDL_LoadBMP("../bola.bmp");
pelota = SDL_DisplayFormat(tmp);
SDL_FreeSurface(tmp);
SDL_SetColorKey(pelota, SDL_SRCCOLORKEY, SDL_MapRGB(pelota->format, 255, 0, 255));
pos_pelota.x = 0;
pos_pelota.y = 0;
pos_pelota.w = pelota->w;
pos_pelota.h = pelota->h;
pos_anterior = pos_pelota;
SDL_BlitSurface(fondo, NULL, pantalla, NULL);
salir = false;
velx = 3;
vely = 3;
cout << endl << "--- Midiendo FPS ---" << endl;
ciclos = 0;
t_inicial = SDL_GetTicks();
while(!salir){
while(SDL_PollEvent(&eventos)){
if(eventos.type == SDL_QUIT) salir = true;
if(eventos.type == SDL_KEYDOWN) salir = true;
}
SDL_BlitSurface(fondo, &pos_anterior, pantalla, &pos_anterior);
SDL_BlitSurface(pelota, NULL, pantalla, &pos_pelota);
SDL_Flip(pantalla);
pos_anterior = pos_pelota;
pos_pelota.x += velx;
pos_pelota.y += vely;
if(pos_pelota.x < 0 || pos_pelota.x > (pantalla->w - pelota->w)) velx *= -1;
if(pos_pelota.y < 0 || pos_pelota.y > (pantalla->h - pelota->h)) vely *= -1;
ciclos++;
if((SDL_GetTicks() - t_inicial) >= 1000){
cout << "FPS: " << ciclos << endl;
ciclos = 0;
t_inicial = SDL_GetTicks();
}
}
SDL_FreeSurface(fondo);
SDL_FreeSurface(pelota);
SDL_Quit();
cout << "--- Fin de la ejecución ---" << endl << endl;
return 0;
}
Windows: Pantalla completa igual que con linux. En modo ventana muy rápido, más de 1000 FPS, casi ni se ve la pelota.
Entonces mi duda es ¿Por qué esa diferencia? ¿Qué hay mal en el código?
A ver si me orientáis un poco
Saludos