rendimiento de SDL

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

rendimiento de SDL

Notapor carleto » Dom Mar 21, 2010 9:00 pm

Hola a todos

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;
}
Linux: Tanto en modo pantalla completa como ventana, anda alrededor de los 100 FPS.

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
std::cout << "Usuario registrado de Linux Nº 504222" << std::endl;
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España

Notapor Juanxo » Dom Mar 21, 2010 11:36 pm

Buenas carleto:

Googleando un poco he visto que quizás el problema se deba a la sincronización vertical de tu monitor. Quizás windows lo desactive en las aplicaciones en modo ventana.

sincronizacion vertical

Pero no parece ser ningún fallo de tu código.

Un saludo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor carleto » Mar Mar 23, 2010 4:47 pm

Hola

Bueno, parece que se ha solucionado añadiendo flag SDL_ANYFORMAT al crear la pantalla.

Ahora, tanto en Linux como windows va más rápido.

Saludos
std::cout << "Usuario registrado de Linux Nº 504222" << std::endl;
Avatar de Usuario
carleto
 
Mensajes: 42
Registrado: Mar Ago 21, 2007 9:38 pm
Ubicación: Almería, España


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron