Python: Surface.blit()

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

Python: Surface.blit()

Notapor MrBB4 » Lun Dic 12, 2011 7:44 pm

Buenas.
Estoy creando un RPG en donde los tiles del mapa se están constantemente imprimiendo en la pantalla de forma individual. Se que no es muy convencional, en general se imprimen todos en una imagen "fondo" y luego solo se imprime esa en pantalla, pero quiero hacer un efecto que solo funcionará como lo estoy haciendo. El probleda de esto es que realizar la operación Surface.blit() tan seguido se come gran parte del procesador y, si bien no lo consume entero, aún así funciona lento. Intenté arreglar esto reduciendo el número de tiles a imprimirse a solamente los que el jugador verá en pantalla, que tenia planeado hacer aunque no me hubiera dado problemas, pero aun así el problema persiste. Alguien sabe si hay otra forma de unir dos superficies sin que consuma tanto procesador?

Mi pregunta es simplemente eso: ¿Hay algún otro metodo para hacer lo mismo? nada muy extenso.
No les doy el codigo porque ya se extendió lo suficiente como para volverse confuso.

Se los agradesco de antemano.
Un saludo y bendisiones para todos ;)
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.

Re: Python: Surface.blit()

Notapor hugoruscitti » Mar Dic 13, 2011 12:53 am

Buenas!,

Usando pygame, hay dos técnicas importantes para
hacer que el juego funcione a mayor velocidad. Primero, tienes
que asegurarte de estar convirtiendo las superficies al
formato de video actual.

Es decir, cada vez que cargues una imagen tendrías que
llamar al método "convert" o "convert_alpha".

Por ejemplo, en un juego típico de pygame podrías
crear una función llamada load que te facilite eso:

def load(filepath, use_alpha=False):
"Carga una imagen optimizando la velocidad de impresion."

image = pygame.image.load("data/" + filepath)

if use_alpha:
return image.convert_alpha()

return image.convert()


Esta función se asegura de que la imagen se convierta al formato
de video inmediatamente después de ser cargada. Esto hace una
diferencia de rendimiento muy grande...

La otra cosa que podrías hacer, es implementar la técnica Dirty Rectangles,
para dibujar parcialmente la pantalla en lugar de todo el
escenario completo:

http://www.losersjuegos.com.ar/traducci ... redupdates

Saludos!
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Python: Surface.blit()

Notapor MrBB4 » Mar Dic 13, 2011 1:12 pm

Jajajajkakajkakjajjaajjakajjaja No puedo creer que se me haya olvidado convertir las imágenes en mi función para cargarlas :mrgreen: Muchísimas gracias Hugo, ahora si puedo seguir desarrollando mi juego :D

Un abrazo.

PD: Si, lo de dirty rectangles, aunque no sabía como se llamaba, ya lo hice creando una función que calcula cuales son los tiles que el jugador ve y solo actualiza esos. Personalmente no me gusta usar la clase sprite de pygame porque me parece innecesaria.
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado