3

I have been making a simple python game using pygame and after I added the feature of switching guns the game started to lag. I have no idea why it is lagging. I have tried rebooting but it didn't work. The code is really short so maybe it is just my computer, but if there is anything that may help run it faster please let me know. Here is the code:

import sys, pygame, pygame.mixer
from pygame.locals import *

pygame.init()

size = width, height = 600, 400

screen = pygame.display.set_mode(size)

pygame.display.set_caption('Blue Screen of Death')

#variables
x = 100
y = 200
gun_type = "gun1"
gun = pygame.image.load("gun1.png")
gun = pygame.transform.scale(gun,(500,250))
gun_sound = pygame.mixer.Sound("gun_sound.wav")
clock = pygame.time.Clock()

while 1:
  mx, my = pygame.mouse.get_pos()
  for event in pygame.event.get():
    if event.type == pygame.QUIT:sys.exit()

    elif event.type == KEYDOWN and event.key == K_ESCAPE:
      sys.exit()
    elif event.type == MOUSEBUTTONDOWN:
      gun_sound.play()
    elif event.type == KEYDOWN and event.key == K_1:
      gun = pygame.image.load("gun1.png")
      gun = pygame.transform.scale(gun,(500,250))
      gun_type = "gun2"
    elif event.type == KEYDOWN and event.key == K_2:
      gun = pygame.image.load("gun2.png")
      gun = pygame.transform.scale(gun,(500,250))
      gun_type = "gun2"
    elif event.type == KEYDOWN and event.key == K_TAB:
    if gun_type == "gun2":
      gun_type = "gun2_aimed"
    elif gun_type == "gun2_aimed":
      gun_type = "gun2"
    elif gun_type == "gun2_aimed":
      gun = pygame.image.load("gun2_aimed.png")
      gun = pygame.transform.scale(gun,(500,250))



  #frames per second
  clock.tick(60)

  hallway = pygame.image.load("hallway.png")
  hallway = pygame.transform.scale(hallway,(600,400))
  screen.blit(hallway,(0,0))

  screen.blit(gun,(mx-100,y))

  pygame.display.flip()

Thanks for your help.

3 Answers3

6

This is probably the most important thing you can learn in Pygame.

For many years, I've had lagging issues in Pygame. I was frustrated, and almost switched to Pyglet. My game was only running at 9 fps.

Then I found some Pygame documentation on my computer. It had some advice from David Clark, and he suggested you add .convert_alpha() at the end of all Pygame image loads. This increased my framerate to 32!

Here's the website:

https://www.pygame.org/docs/tut/newbieguide.html

I always just create a function to do it for me, so I don't have to keep typing '.convert_alpha()' too many times:

def loadify(imgname):
    return pygame.image.load(imgname).convert_alpha()

Just replace pygame.image.load( to loadify( when using this function.

Have fun with Pygame!

2

You could try to load the images of your guns before the while loop and save a reference to them, this way you don't have to load the image on the fly every time.

Mathieu Borderé
  • 4,357
  • 2
  • 16
  • 24
1

Don't call pygame.image.load from your event handler.

Instead, call it on all of your resources at startup and just switch out which one you use.

o11c
  • 15,265
  • 4
  • 50
  • 75