Ver la versión completa : descenso de FPS exagerado por un SDL_BlitSurface?
the_goulin
29/08/2006, 05:47
hola,
estoy programando un juegecillo y me encuentro con una duda, cuando empece a programarlo como fondo temporal utilize un SDL_FillRect pero ahora he querido poner la imagen que debe ir como fondo y me encuentro que el juego pega un bajon de FPS bestial (10~15 o mas)
el bucle es este
while (!done)
{
SDL_Event event;
repeticiones = fps_sincronizar ();
//SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 128, 128, 128));
SDL_BlitSurface(fondo,NULL,screen,NULL);
for (i = 0; i < repeticiones; i ++)
{
messageLoop();
#ifdef __ENEMIGOS
generadorOrcos();
#endif
mueveOrcos();
}
drawFPS(font,screen);
lorco.ResetIndex(0);
while ((orco=lorco.GetNextObject(0))!=NULL)
{
#ifdef __DEBUG_MODE
estadoOrco();
#endif
#ifdef __DRAW_SPRITES
orco->Draw(screen);
#endif
}
SDL_Flip(screen);
}
os a pasado a alguno? hay alguna solucion?
asias
Se me ocurre q la imagen q usas no sea del mismo formato q la pantalla, 32bpp y la pantalla la tienes iniciada a 16bpp con lo cual se explicaria ese descenso de fps.
A no ser q hayas modificado algo mas en el source y se te haya pasado (como me pasa a mi xD)
titerote
29/08/2006, 06:09
O asegúrate de usar las SDL aceleradas por hardware.
Sin ver algo más de tu código estoy con Eskema en su razonamiento sobre porque puede ser que tengas un bajo FPS a la hora de hacer el blitting. Cuando se hace el blitting con SDL, si la superficie que quieres blittear está en un formato de pixel (la profundidad de color de pixel) distinto de la pantalla el blitting es más lento porque SDL tiene que hacer la conversión al formato de pixeles de la pantalla "al vuelo" así que lo ideal es que si la imagen, o mejor dicho, la superficie a blittear, no está con el mismo formato de pixel que la pantalla, que tendría que coinicidir con el que se haya especificado en SDL_SetVideoMode(), conviertas la superificie (usando una superficie temporal antes) al formato correcto con la función SDL_DisplayFormat() (http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fDisplayFormat) antes de usar SDL_BlitSurface() con esa superficie con el formato de pixel ya correcto, así SDL no tendría que realizar esta conversión, el blitting sería mucho más rapido y por tanto deberían aumentar los FPS.
También pienso que puede ser debido a lo que comentan Eskema y Uncanny, y de hecho yo también lo "sufrí". Y por supuesto, esto vale también para cualquier imagen que no tenga el formato que espera tu aplicación, fondo o no. Aunque ya te lo han explicado muy bien, lo complemento con algo de código. Puesto que ese SDL_DisplayFormat convierte la imagen al formato adecuado, lo has de hacer una sola vez, al principio (por ejemplo, justo después de cargar la imagen). Luego en cada vuelta de bucle llamas a SDL_BlitSurface tal como lo haces ya, pero usando la imagen convertida.
SDL_Surface *imagenTmp, *imagenOk;
imagenTmp = IMG_Load("loquesea");
imagenOk = SDL_DisplayFormat(imagenTmp);
SDL_FreeSurface(imagenTmp);
the_goulin
29/08/2006, 15:04
joer, que va a ser lo de la imagen, :/ ya me podia yo romper los cuernos a optimizar.
muchas gracias, esta tarde cuando llege a casa lo pruebo.
Los fallos mas tontos son los mas complicados de encontrar siempre, por eso yo tengo una funcion como miq, y cuando cargo cualquier imagen la convierto al formato de pantalla, de esta forma me evito peliculas raras.
Como te he dicho uncanny si no haces la conversion sdl se encarga de hacerlo por ti, pero !!!en cada frame!! con lo cual la bajada puede ser considerable.
D_Skywalk
29/08/2006, 17:05
Aunque Miq01 no lo ha indicado, supongo que para no complicar mucho mas el ejemplo, SIEMPRE es conveniente comprobar que la imagen cargada y la posterior imagen convertida sean distintas de NULL.
Asi evitareis los a veces incomprensibles "parachutes" :)
Un Saludo compas!
< - >
Adjunto mi codigo para cargar bitmaps que uso en Abalon, a ver que sus parece:
/////////////////////////////////////////
//Funcion con el color transparente que usara la aplicacion en general.
#define F_TRANSPARENTE(X) SDL_MapRGB(X, 255,0x0,255)
extern SDL_Surface *pantalla;
/*! \fn bool cBitmap_Load(SDL_Surface **miBitmap, char *Filename, Uint8 flags)
\brief Carga un grafico y le aplica los efectos requeridos. Esta funcion ademas convierte los bitmaps a 16bits si es requerido.
\param miBitmap La superficie del usuario que sera usada para cargar el grafico con los efectos aplicados.
- SERA MODIFICADA.
- DEBE LLEGAR LIBERADA, NO SE COMPROBARA SI LA SUPERFICIE ESTA EN USO O NO.
\param Filename Ruta completa al fichero que contiene el grafico.
\param flags Efectos que le deveran ser aplicados.
\return si todo fue bien devuelve TRUE (1).
\note si usas 8 bits recuerda definir su soporte.
*/
bool cBitmap_Load(SDL_Surface **miBitmap, char *Filename, Uint8 flags){
SDL_Surface *temp = NULL, *temp2;
int n;
if( (temp=IMG_Load(Filename)) == NULL)
return FALSE;
//Bitmap no soportado a 24bits... convirtiendo a 8 o 16 dependiendo de pantalla...
if(pantalla->format->BitsPerPixel != temp->format->BitsPerPixel){
#ifdef DEBUG_SPRITE_H
fprintf(stderr, "Warning, imagen convertida de %i a %i bits\n", temp->format->BitsPerPixel, pantalla->format->BitsPerPixel);
#endif
temp2 = SDL_ConvertSurface(temp, pantalla->format, SDL_SWSURFACE);
SDL_FreeSurface(temp);
temp = temp2;
}
//Hacemos el mirror si es pedido por el usuario, antes del transparente sino se bliteara mal...
if(flags){
temp2 = QuickSurface(temp->w, temp->h, temp->format->BitsPerPixel);
SDL_Blitfx(temp2, NULL, NULL, temp->w/2, temp->h/2, flags, 0, 100, 100, temp);
SDL_FreeSurface(temp);
temp = temp2;
}
SDL_SetColorKey(temp, SDL_SRCCOLORKEY | SDL_RLEACCEL, F_TRANSPARENTE(temp->format));
#ifdef SUP8BITS_SPRITE_H
/* Mete la paleta de la imagen en PANTALLA */
if ( temp->format->palette ) {
ChangePalette(temp->format->palette->colors, temp->format->palette->ncolors);
}
#endif
*miBitmap = SDL_DisplayFormat(temp);
if(*miBitmap == NULL)
{
*miBitmap = temp;
}
else
{
SDL_FreeSurface(temp);
}
return TRUE;
}
Notas:
- Necesitareis las librerias "SDL_plusplus" de Puck, si quereis usar los flags de espejado o zooms :)
- Yo solo uso 16bits, si quereis que la funcion soporte 8bits tambien definid en alguna parte de vuestro codigo: "SUP8BITS_SPRITE_H"
- QuickSurface es una funcion muy simple que genera una superficie con el tamaño indicado usando "SDL_CreateRGBSurface". Si alguien la necesita que lo diga ;)
Un Saludo y espero que os sea util :D
the_goulin
30/08/2006, 03:04
:D ahora va de coña, muchas gracias a todos [wei6]
otra cosa, supongo que no habra nada pero por preguntar, ¿hay alguna manera de compilar desde el pc y que se ejecute en la 2x via usb? lo digo para no tener que estar sacando la SD cada vez que tengo que probar algo.
ahora mismo uso winxp ya q parece que a ninguna distribucion de linux le gusta mi makina y ademas soy un poco negadillo para el linux :P (por mas que me esfuerzo el puede mas que yo)
Que alguien me corrija si no, pero creo recordar que el blitting por hardware de la gp2x no funciona con profundidades de color superiores a 16bpp, ¿no?
Pues si goulin, hay una manera, y es usando el cliente de samba, montando un directorio de tu pc en /mnt/sd/<carpeta> (así puedes acceder desde el menú de la gp) conectandote por telnet para hacer esto, claro.
Así, entras como si entraras a la SD pero lo que se ve es el directorio de tu pc. Simple y va de bien que no te lo imaginas xD
Hace un tiempo recopilé toda la info sobre esto en un pdf que lo subieron a descargas, te pongo aquí el link:
http://www.gp32spain.com/foros/downloads.php?do=file&id=735
Básicamente te explicará lo que ya sabrás, montar una red entre la GP y el PC. Luego, como un apendice te pone como instalar el cliente samba (recordemos que lo que lleva el firm 2.0 es el server solo) y como montar directorios de tu PC.
the_goulin
31/08/2006, 04:32
Pues si goulin, hay una manera, y es usando el cliente de samba, montando un directorio de tu pc en /mnt/sd/<carpeta> (así puedes acceder desde el menú de la gp) conectandote por telnet para hacer esto, claro.
Así, entras como si entraras a la SD pero lo que se ve es el directorio de tu pc. Simple y va de bien que no te lo imaginas xD
Hace un tiempo recopilé toda la info sobre esto en un pdf que lo subieron a descargas, te pongo aquí el link:
http://www.gp32spain.com/foros/downloads.php?do=file&id=735
Básicamente te explicará lo que ya sabrás, montar una red entre la GP y el PC. Luego, como un apendice te pone como instalar el cliente samba (recordemos que lo que lleva el firm 2.0 es el server solo) y como montar directorios de tu PC.
muchas gracias, en cuanto llege a casa lo pruebo [wei4]
< - >
lo de la 2x conectada al pc va de coña [wei4] lo unico que no he instalado el el samba.
en el documento pone esto: "Lo que vemos ahora es la raíz del sistema operativo, esto es la NAND, por lo que al instalar el
cliente de SAMBA estaremos acortando la vida de la misma, eso si, lo agradeceréis si
desarrolláis." ha que se refiere?
hay alguna manera de decirle al dev-cpp que cuando compile para gp2x lo copie directamente a la carpeta de la 2x (\\192.168.100.2\gp2x\mnt\sd)?
bueno, lo dicho, esto para depurar me ira de coña ^_^
asias
Sabes que si instalas el cliente samba puedes hacer que un directorio de tu ordenador aparezca en el menú de la gp2x ¿no? Porke mas o menos eso es lo que necesitas, que salga el directorio donde el DEV mete el ejecutable, asi no lo tienes ni que copiar a la consola :D
Que alguien me corrija si no, pero creo recordar que el blitting por hardware de la gp2x no funciona con profundidades de color superiores a 16bpp, ¿no?Eso creo, de hecho con la librería SDL de Paeryn solo se puede aprovechar la aceleración por hardware si se trabaja con superficies de 16 bpp.
the_goulin
31/08/2006, 15:22
Sabes que si instalas el cliente samba puedes hacer que un directorio de tu ordenador aparezca en el menú de la gp2x ¿no? Porke mas o menos eso es lo que necesitas, que salga el directorio donde el DEV mete el ejecutable, asi no lo tienes ni que copiar a la consola :D
si, lo se, pero me mosquea esa parte del texto donde pone que le acortare la vida a mi gp
¿a que se refiere exactamente?
si, lo se, pero me mosquea esa parte del texto donde pone que le acortare la vida a mi gp
¿a que se refiere exactamente?
La nand como las tarjetas SD, tienen un número máximo de escrituras y a partir de ahí pueden dejar de funcionar, si jodes una sd por darle mucha tralla, la cambias y punto, pero si jodes la nand, jodes la gp para siempre.
the_goulin
31/08/2006, 16:06
La nand como las tarjetas SD, tienen un número máximo de escrituras y a partir de ahí pueden dejar de funcionar, si jodes una sd por darle mucha tralla, la cambias y punto, pero si jodes la nand, jodes la gp para siempre.
correcto, pero tampoco pienso compilar directamente en la nand, solo voy a instalar un programa y luego trabajar con el, vamos que voy a ejecutar samba cada vez al encender la consola, luego el programa se instanciara en la ram y el resto del uso sera de mi unidad compartida.
con esto quiero decir que teoricamente no gastare mas la nand de lo que ya la gasto cuando enciendo la consola.
Arranque consola:
| LINUX -> SAMBA | ¿se ejecuta una vez por arranque no?
o samba utiliza la nand para memoria de intercambio?
Pues no, no me equivoqué, el cliente SAMBA no viene con el firm 2.0, de modo que hay que copiar los archivos 1 vez para tenerlos en la NAND. Luego, lo que hacemos es el insmod para instalarlo, pero eso ya no gasta la NAND.
Como bien dicen, la ventaja del cliente samba es coger archivos del PC directamente, no como con el servidor, que lo que haces es compilar y copiar desde el PC a la SD montada en la GP.
Si quieres seguir así, lo que si que puedes hacer es copiar el proyecto entero del devc++ a un directorio de la SD y abrirlo mediante samba desde el pc, de modo que al compilar, estas compilando en el mismo directorio, que ya está en la SD.
Por cierto Uncanny, tas poniendo post muy cortos.. te encuentras mal? xD
ues no, no me equivoqué, el cliente SAMBA no viene con el firm 2.0, de modo que hay que copiar los archivos 1 vez para tenerlos en la NAND. Luego, lo que hacemos es el insmod para instalarlo, pero eso ya no gasta la NAND.
Como bien dicen, la ventaja del cliente samba es coger archivos del PC directamente, no como con el servidor, que lo que haces es compilar y copiar desde el PC a la SD montada en la GP.
Si quieres seguir así, lo que si que puedes hacer es copiar el proyecto entero del devc++ a un directorio de la SD y abrirlo mediante samba desde el pc, de modo que al compilar, estas compilando en el mismo directorio, que ya está en la SD.
Por cierto Uncanny, tas poniendo post muy cortos.. te encuentras mal? xD
ues no, no me equivoqué, el cliente SAMBA no viene con el firm 2.0, de modo que hay que copiar los archivos 1 vez para tenerlos en la NAND. Luego, lo que hacemos es el insmod para instalarlo, pero eso ya no gasta la NAND.
Como bien dicen, la ventaja del cliente samba es coger archivos del PC directamente, no como con el servidor, que lo que haces es compilar y copiar desde el PC a la SD montada en la GP.
Si quieres seguir así, lo que si que puedes hacer es copiar el proyecto entero del devc++ a un directorio de la SD y abrirlo mediante samba desde el pc, de modo que al compilar, estas compilando en el mismo directorio, que ya está en la SD.
Por cierto Uncanny, tas poniendo post muy cortos.. te encuentras mal? xD
Si montas un directorio (recurso) en tu PC para usarlo via SAMBA desde la GP2X (gracias al cliente SAMBA) no escribes en la NAND, es decir, en realidad estás usando el directorio de tu PC y usas como punto de montaje (como si fuera un acceso directo / enlace simbólico) un directorio de tu GP2X, como puede ser /mnt/ext, así no escribes nada en la NAND pero puedes ejecutar cualquier programa en la GP2X que hayas almacenado en ese directorio en el sistema de tu PC que estás usando como recurso compartido en SAMBA con la GP2X.
the_goulin
31/08/2006, 21:47
Si montas un directorio (recurso) en tu PC para usarlo via SAMBA desde la GP2X (gracias al cliente SAMBA) no escribes en la NAND, es decir, en realidad estás usando el directorio de tu PC y usas como punto de montaje (como si fuera un acceso directo / enlace simbólico) un directorio de tu GP2X, como puede ser /mnt/ext, así no escribes nada en la NAND pero puedes ejecutar cualquier programa en la GP2X que hayas almacenado en ese directorio en el sistema de tu PC que estás usando como recurso compartido en SAMBA con la GP2X.
ok, lo que no entiendo es por que en el documento pone que se le acortara la vida a la nand :/
no instalare samba pq no le veo utilidad, lo unico que me ahorro es copiar el fichero a la sd, cosa que puedo hacer con un bat, incluso probablemente a dev-cpp se le pueda decir que despues de compilar lo copie automaticamente.
ok, lo que no entiendo es por que en el documento pone que se le acortara la vida a la nand :/
no instalare samba pq no le veo utilidad, lo unico que me ahorro es copiar el fichero a la sd, cosa que puedo hacer con un bat, incluso probablemente a dev-cpp se le pueda decir que despues de compilar lo copie automaticamente.Ni idea, quizás Theck se confundió al escribirlo o se refería a otra cosa, porque ni siquiera hay un archivo swap de intercambio que yo sepa.
Lo de usar el cliente SAMBA tiene su utilidad, por ejemplo, no necesitas ninguna SD para probar tus programas con la GP2X, simplemente con la conexión USB ya puedes usar cualquier directorio de tu sistema en la GP2X y trabajar con el como si estuviera en una SD o en la propia NAND de la GP2X.
the_goulin
31/08/2006, 22:12
Ni idea, quizás Theck se confundió al escribirlo o se refería a otra cosa, porque ni siquiera hay un archivo swap de intercambio que yo sepa.
Lo de usar el cliente SAMBA tiene su utilidad, por ejemplo, no necesitas ninguna SD para probar tus programas con la GP2X, simplemente con la conexión USB ya puedes usar cualquier directorio de tu sistema en la GP2X y trabajar con el como si estuviera en una SD o en la propia NAND de la GP2X.
bueno, esa utilidad si que le veo, por ejeplo si tienes la SD en la DS , sera plan de probarlo
La utilidad es enorme no? Compilas en el pc y ejecutas desde la gp2x a saco...
Por cierto Uncanny, tas poniendo post muy cortos.. te encuentras mal? xDQue va, sigo escribiendo mis post tochos de siempre, solo que ultimamente antes de enviarlos les hago un "strip" y algunos se quedan más reducidos xDDD
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.