Почему моя игра-головоломка теряет кадры при отображении ректов? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь написать простую игру, в игре есть объект игрока и пол с использованием петель для его создания. Я не уверен, почему его потери кадров так быстро, хотя. У меня есть часы, чтобы отметить 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...

1 Ответ

1 голос
/ 13 июня 2019

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

Давайте предположим, что ваши блоки "уровня 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)
...