Почему моя игра в pygame такая медленная?

#python

#python

Вопрос:

Я создаю игру в Pygame. Теперь у меня на экране движется только один прямоугольник. Направление прямоугольника можно изменить с клавиатуры.

main.py :

 import pygame
import sys
import player
import room

# Colors
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
blue = (0, 255, 0)
green = (0, 0, 255)

# Global variables
S_WIDTH = 800
S_HEIGHT = 800
FPS = 60
# player speed
SPEED = 2

# Initialization 
pygame.init()
screen = pygame.display.set_mode([S_WIDTH, S_HEIGHT])
pygame.display.set_caption("Py-Man Alpha")
clock = pygame.time.Clock()

# Game class
class Game(object):
"""
This is main class of game.
All game events will happen here.
"""
Player = player.Player(blue, 50, 50, 0, 0) 
def __init__(self, screen, running):
    self.screen = screen
    self.running = running

    self.run()

def run(self):
    while self.running:
        # Events
        for event in pygame.event.get():
            # If user hits 'x'
            if event.type == pygame.QUIT:
                self.running = False
            # Keyborad events
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    self.Player.direction = 'up'
                    self.Player.move(SPEED, WALLS)
                elif event.key == pygame.K_DOWN:
                    self.Player.direction = 'down'
                    self.Player.move(SPEED, WALLS)
                elif event.key == pygame.K_LEFT:
                    self.Player.direction = 'left'
                    self.Player.move(SPEED, WALLS)
                elif event.key == pygame.K_RIGHT:
                    self.Player.direction = 'right'
                    self.Player.move(SPEED, WALLS)
                elif event.key == pygame.K_p:
                    self.Player.direction = 'pause'
        # Clear screen
        self.screen.fill(white)

        #Draw
        self.Player.move(SPEED, WALLS)
        self.Player.draw(self.screen)
        for wall in WALLS:
            wall.draw()

        # Set clock
        clock.tick(60)

        # Update screen
        pygame.display.flip()

    # End of game
    pygame.quit()
    sys.exit()

# Tests
game = Game(screen, True)
 

player.py:

 #imports
import pygame

class Player(pygame.sprite.Sprite):
"""
This class represent the player image
and has the player actions.
"""
direction = 'right'
def __init__(self, color, width, height, x, y):
    # Pygame constructor
    pygame.sprite.Sprite.__init__(self)

    # Init. variables
    self.color = color
    self.width = width
    self.height = height 

    # Create sprite
    self.image = pygame.Surface([width, height])
    self.image.fill(self.color)
    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y

def draw(self, screen):
    # Draw player on the screen
    pygame.draw.rect(screen, self.color, [self.rect.x, self.rect.y, self.width, self.height], 0)

def move(self, speed, walls):
    # Move the player
    if self.direction == 'up':
        self.rect.y -= speed
    elif self.direction == 'down':
        self.rect.y  = speed
    elif self.direction == 'left':
        self.rect.x -= speed
    elif self.direction == 'right':  
        self.rect.x  = speed
 

итак, как я могу ускорить свою игру? Как я могу улучшить скорость? Где я ошибаюсь?
Спасибо!

РЕДАКТИРОВАТЬ: обновление монитора происходит медленно. Я нажимаю клавишу «вверх», но монитор принимает команду через 2-3 секунды. Почему?

Комментарии:

1. Этот вопрос, похоже, не по теме, потому что речь идет об улучшении рабочего кода, он может лучше подойти для codereview.stackexchange.com

2. Вы пробовали увеличивать SPEED переменную? Держу пари, это даст вам больше скорости.

3. что такое медленно? обновление экрана или скорости проигрывателя?

4. возможно, вы можете попробовать обновить только после выполнения действия?

5. Я согласен с @Tim. Чтобы этот вопрос был не по теме, вам нужно профилировать свой код и определить узкое место, а затем конкретно спросить об этом.

Ответ №1:

Вы можете увеличить SPEED или clock.tick(60)

Но я предпочитаю увеличивать SPEED .

clock.tick(60) означает 60 FPS , и вы могли бы увеличить его, но многие мониторы обновляют его экран с 60Hz помощью and it means 60 FPS . Больший FPS означает больше работы для процессора, поэтому он горячее, и вы можете услышать вентилятор процессора 🙂

Кстати: человеческому глазу требуется не менее 24 кадров в секунду, чтобы увидеть анимацию.