Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Bajo rendimiento engine 2D con SDL

Iniciado por mourules, 09 de Junio de 2003, 12:59:43 PM

« anterior - próximo »

mourules

                                Hola a todos.

Estoy haciendo un engine (sobre el un juego de naves) basado en SDL. Haciendo scroll de tres niveles, en el que el fondo es un bmp y los otros dos son capas formadas por tiles con alphablending + colorkey transparente (por tile, no por pixel) tengo unos rendimientos muy muy bajos (2-3 frames x segundo). Al mismo tiempo controlo un sprite sin alphablending pero con colorkey a través de teclado.

Trabajo sobre un AMD 200Mhz y una ATI Rage Pro AGP de 4Mb, Win95 y DirectX8. He probado diferentes modos de vídeo y el más rápido es el de 32bpp. Los gráficos están creados en 24bpp.

Inicializando el SDL uso doblebuffer y aceleración HW y pantalla completa a 640x480.

¿Es este rendimiento normal?

He visto otros juegos y todo va muchísimo más rápido.

¿Cuál creeis que es el origen del problema? ¿El alphablending?¿Los bpp seleccionados? ¿el bmp de fondo?

Un saludo y gracias por adelantado por vuestra colaboración.                                

sés

                                No lo sé, pero no es normal. Puedes bajarte el Fist PC de mi página (http://ses.mgbr.net). Debería irte bien.

Si tienes curiosidad, puedo mandarte un ejecutable que vaya al máx. de FPS (debería haber puesto una tecla que lo hiciera ^_^) y compruebas cómo tira.

De todas formas ten en cuenta que las funciones de dibujar son mías y no uso las de la SDL, esas no sé cómo irán :P, pero me extraña que sean tan leeeeentas.                                
Soy indeciso... ¿o no?

samsaga2

                                Puede que estes usando las imagenes cargadas directamente para dibujarlas en pantalla, mal hecho, ya que SDL tiene que ir convirtiendo todo el rato el formato de bits. Usa la funcion SDL_DisplayFormat http://sdldoc.csn.ul.ie/sdldisplayformat.php y SDL_DisplayFormatAlpha (para las imagenes con color alpha) http://sdldoc.csn.ul.ie/sdldisplayformatalpha.php.

Por otro lado hay una libreria glSDL que hace que se use la aceleracion 3d de la tarjeta de video para hacer 2d (busca glSDL en la web libsdl.org apartado librerias).                                

mourules

                                Gracias a todos!

Esto es lo que hago por cada tile que compone el layer.

Voy leyendo de disco los tiles y les aplico el colorkey y luego el alpha si este es diferente de "opaco" (255)



SDL_Surface *temp;

     

 if((temp = SDL_LoadBMP(fileName)) == NULL) return -1;

   

 SDL_SetColorKey(temp, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(temp->format, r, g, b));

 

 if (alpha != 255)

 { SDL_SetAlpha(temp,SDL_SRCALPHA|SDL_RLEACCEL,alpha);

  mTileList[i].image = SDL_DisplayFormatAlpha(temp);

 }

 else mTileList[i].image = SDL_DisplayFormat(temp);

 

 SDL_FreeSurface(temp);



Todas las surfaces (el fondo, sprites ...) tiene su propio SDL_DisplayFormat.

¿Dónde véis el problema?

¿Quizá tengo que usar menos bpps? Los BMPs originales deben estar a 256 colores?. Si entiendo bien SDL y DisplayFormat, el bpp de los BMPs originales da igual porque luego se convierten al formato al inicializar, no?

A 32bpp me va regular, a 15 y 24 bpp me va peor y a 16bpp no va mal del todo, aunque en cuanto el juego tenga más lógica y música va a ser imposible!

¿qué me pasa doctor?  :oops:

Un saludo y gracias por adelantado!                                

sés

                                Puede ser lo que te ha dicho samsaga2, yo ni idea. Como te he dicho, no uso las funciones de SDL para dibujar.                                
Soy indeciso... ¿o no?

samsaga2

                                Mi funcion para optimizar superficies del sdl:



Uint32

flags = SDL_SWSURFACE | SDL_RLEACCEL;



// --- convert pixel format to screen pixel format ---

SDL_Surface* temp;

if(sdlsurface->flags & SDL_SRCALPHA)

{

 temp = SDL_DisplayFormatAlpha(sdlsurface);

 flags |= SDL_SRCALPHA;

}

else

 temp = SDL_DisplayFormat(sdlsurface);



SDL_FreeSurface(sdlsurface);

sdlsurface = temp;



Y despues para dibujar no hago mas que un simple SDL_BlitSurface.

Por cierto ahora que me acuerdo, como son tus superficies (por software o  por hardware). Deberian ser todas por hardware:



SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF)



El tema de superficies en hardware afecta mucho a la velocidad.                                

mourules

                                Uso doble buffer hw surface full screen a 640 480 con 16 bits                                

samsaga2

                                Postea tu codigo de incializacion de video, carga/creacion de superficies y dibujado para que le echemos un vistazo.                                

mourules

                                Muchas gracias samsaga2! Ahora estoy en la oficina y no tengo el código, esta tarde lo postearé.

Cuando resolvamos esto os postearé también algunos "captures" de la pantalla a ver que os parecen los gráficos!

:D                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.