Estoy trabajando en un desplazamiento lateral 2D en PyGame. Para cada mapa usamos una textura (este es el tamaño real de la textura):
Luego cargamos la imagen con este código:
sprite = pygame.image.load("Maps/MapTesting.png")
sprite.convert()
sprite = pygame.transform.scale(sprite,
(sprite.get_width()*6, sprite.get_height()*6))
Como puede ver, la textura se explota 6 veces para crear la textura del mapa real. En promedio, esta textura es de aproximadamente 4500x800. Esta textura tiene que borrarse a la pantalla cada fotograma , porque toda la pantalla está sucia (gracias al desplazamiento lateral). Hacemos eso usando este código:
screen.blit(sprite, (0, 0),
(cameraposx, cameraposy, windowheight, windowwidth))
Y funciona. El problema es que es bastante lento: obtengo unos escasos 40 FPS en una PC poco decente, y eso sin que ocurra ninguna de las IA / objetos reales, mientras apuntamos a 60 FPS. ¿Cómo podemos acelerar esto?
Tenga en cuenta que el código anterior se desinfecta y se saca de contexto. El código completo se puede encontrar aquí: https://github.com/nightcracker/PyGG2
Y por último, pero no menos importante, aunque la imagen de arriba puede parecer de 8 bits, hay elementos en el juego que requieren más profundidad de bits.
Respuestas:
Permítanme enumerar algunas optimizaciones comparadas generales relacionadas con Blitting píxeles a una superficie (desde mi experiencia).
1) Por lo general, las imágenes de paleta (imágenes indexadas) cuando se borran tendrán un nivel adicional de redireccionamiento (para obtener el color), por lo que serán lentas cuando se borren en comparación con las imágenes en color real.
2) Los datos de píxeles de color verdadero (suponga que sin Alpha - digamos datos de 24 bits) pueden borrarse muy rápido, ya que podemos hacer una memoria para cada línea de escaneo de la imagen (si estamos copiando una parte de la imagen) en el búfer del marco del dispositivo Si los datos que se borran son una imagen completa, entonces podemos memorizar directamente todos los datos, ¡lo cual es mucho más rápido!
3) Los datos de píxeles Alpha de Blitting serán los más costosos, ya que incluirán el cálculo de cada componente resultante y necesitamos empacarlos nuevamente en datos RGB. En términos simples, ¡más operaciones para cada píxel para obtener el color final!
No he trabajado en pyGame antes, pero, un vistazo rápido al código fuente, me lleva a suponer que está usando funciones 'sdl' Blit debajo del capó. Por lo general, Sdl blit será mucho más rápido y optimizado, así que no hagas caso de los puntos y el perfil anteriores una vez más. ¡Buena suerte!
* Actualización: * La configuración de la clave de color es como agregar un cheque adicional al borrar cada píxel a la superficie. Algo así:
Entonces, aquí, si ve, ¡estamos limitados a no usar memcpy, ya que necesitamos verificar la validez de color de cada píxel!
fuente
set_colorkey
deslizarse en la textura del mapa, dándole un canal alfa (costoso). Aconvert
solucioné eso, y ahora estoy ejecutando 150 FPS estables en esta PC de mierda. ¡Gracias!sprite.convert()
no hace lo que crees que hace.sprite = sprite.convert()
es lo que necesitasfuente
sprite = sprite.convert()
en el código real, aunque :)sprite = pygame.image.load("Maps/MapTesting.png").convert()