ola ola.. estaba tratando d hacer aca un engine en 2D con SDL.. y al ver lo feo d mis fps.. decidi buscar a ver si encontraba x la red algo para aumentar la velocidad.. y lo unico q encontre fue q use opengl, uno q posteaba un link roto a un codigo para mac para q solo se actualize la parte d la pantalla q cambio desde el ultimo frame, y tb uno q me sirvio fue el d displayformat:
SDL_Surface *image;
image = SDL_LoadBMP("llalala.bmp");
image = SDL_DisplayFormat(images);
y eso t aumenta un poco la velocidad... q es mucho cuando se forea en X y en Y como es mi caso =)
pero despues no encontre nada mas.. alguna aiuda? gracias!!
saludos y suerte
¿Estas seguro de que no estás cargando la imagen continuamente?
la imagen (osea la SDL_Surface conteniendo ese tile) lo cargo una vez cuando cargo el mapa y nunca mas despues.. si kieren subo el codigo
Cita de: "Abc7"SDL_Surface *image;
image = SDL_LoadBMP("llalala.bmp");
image = SDL_DisplayFormat(images);
Ojo! el SDL_DisplayFormat te crea una nueva superficie, por lo que cada vez que haces lo de antes estas perdiendo memoria.
Y ya que estamos, el
juego en el que estoy trabajando funciona sobre SDL, y va bastante bien. Puedes mirar el codigo fuente para ver como me las apanyo con el SDL (esta en Delphi, pero vamos, haz un grep buscando funciones SDL_ ;) ).
es verdad se me safo una 's'.... no estoy creando una nueva.. sino q uso la misma... seria image = SDL_DisplayFormat(image);
ahora echo un vistazo al codigo.. si es q el mouse se digna en andar :P
Precisamente el problema esta en la linea:
image = SDL_DisplayFormat(image);
SDL_DisplayFormat recoge la imagen pasada por parametro y devuelve una nueva. Como "image" es un puntero, los datos a los que apuntaba se pierden = basura (memoria sin liberar).
< IMAGEN_8BITS>>
image = SDL_DisplayFormat(image);
< IMAGEN_16BITS>>
<--huerfanito!!!!)>>
Nunca olvides leerte muy bien la definicion de la funcion en la ayuda, que a veces ocultan sorpresas de este tipo.
bueno algunas cosas sobre SDL, el displayformat no nos aumenta los fps realmente, lo que ase simplemente es sacar una copia de una surface por ende nos consume algo mas de memoria en hacer la copia, usa el mismo formato por ende no necesariamente tiene que ser mas compatible con el screen.
lo que si aumentar considerablemente los fps de una aplicacion con SDL es el updatear la screen donde requiere simplemente ser updateada, ejemplo enves de blitear y updatear la pantalla entera solo bliteamos la porcion que a cambiado de la pantalla. sinceramente esto crea una gran ganancia en el tema de velocidad
SDL_DisplayFormat( image ) sí aumenta la velocidad. No crea una simple copia de la superficie, crea una copia con el mismo formato de pixels que la memoria de video, lo que se traduce en un aumento de la velocidad.
Lo que espero, Abc7, es que eso lo hagas solo una vez y no en cada fotograma.
Lo lógico sería algo como:
SDL_Surface *image, *aux;
aux = SDL_LoadBMP( "llalala.bmp" );
image = SDL_DisplayFormat( aux );
SDL_FreeSurface( aux );
Así tienes la imagen en el mismo formato que la pantalla.
P.D.: Realmente nunca lo he probado :P, yo uso mis propias funciones para dibujar imágenes, pero es así (según la documentación... y por pura lógica).
OFFTOPIC[ONTOPIC]: Habeis probado CImg?, es una librería para tratar imágenes aunque tb se pueden renderizar. Hay hecho un tetris en poquísimas líneas.
saludos