Почему моя игра pygame теряет кадры при отображении прямоугольников?

Я пытаюсь написать код простой игры, в игре есть объект игрока и пол, использующий циклы для его создания. Я не уверен, почему он так быстро теряет кадры. У меня есть часы, которые показывают 60 кадров в секунду, но быстро падают до 15 кадров в секунду. Заранее спасибо!

main.py

black = (0, 0, 0)
blue = (50, 60, 200)
white = (255, 255, 255)
font = pygame.font.Font(None, 30)

window = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Platformer")

gravity = -0.5

player = Player(400, 0)

level1 = [
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]


]

    for y in range(0, len(level1)):
        for x in range(0, len(level1[y])):
            if level1[y][x] == 1:
                blockList.append(Block(x*32, y*32))

    window.fill(blue)

    for block in blockList:
        block.render(window)

    player.x += moveX

    player.update(gravity, blockList)
    player.render(window)

    clock.tick(60)
        for x in range(0, len(level1[y])):
            if level1[y][x] == 1:
                blockList.append(Block(x*32, y*32))``` Im pretty sure thats where the error is...

Вы делаете этот двойной цикл level1 каждый кадр? Возможно, это можно переместить в раздел инициализации перед входом в основной цикл.   —  person Community    schedule 13.06.2019

как бы я это сделал? Извините, я новичок в Python   —  person Community    schedule 13.06.2019

Вам нужно будет отредактировать свой вопрос, чтобы включить весь код или, по крайней мере, основной цикл. Невозможно предложить изменения без большей части кода.   —  person Community    schedule 13.06.2019

См. также:  Ошибка трассировки: ModuleNotFoundError: нет модуля с именем tenorflow.keras
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Community

    Здесь есть хороший момент для учебы. Один из первых шагов в оптимизации кода — исключить ненужные математические вычисления из циклов. Как предлагается в комментарии, если вы запускаете этот двойной цикл внутри вычисления каждого кадра, это, вероятно, сильно замедляет вас. Возможно, и другие вещи тоже.

    Предположим, что ваши блоки «уровня 1» не меняются от кадра к кадру. Итак, мы можем вычислить черный список до того, как вы начнете цикл.

    # make blocklist
    level1= [[0,0, ... , 0],
                  ...
             [1,1, ... , 1]]
    
    blocklist = []
    for y ...
      for x ...
        blocklist.append(...)
    
    # now start your frame loop
    while True:
      window.fill()
      for block in blocklist:
        ...
      clock.tick(60)
    

    Двойная петля — это пример квадратичного времени. person Community; 13.06.2019

    извините, супер новичок в stackoverflow, даже не знаю, как правильно отформатировать вопрос person Community; 16.06.2019

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: