Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的pygame游戏在显示矩形时会丢失帧?_Python_Macos_Pygame_Frame Rate - Fatal编程技术网

Python 为什么我的pygame游戏在显示矩形时会丢失帧?

Python 为什么我的pygame游戏在显示矩形时会丢失帧?,python,macos,pygame,frame-rate,Python,Macos,Pygame,Frame Rate,我试图编写一个简单的游戏,这个游戏有一个玩家对象和一个使用循环创建的地板。我不知道为什么它的帧丢失得这么快。我有时钟滴答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_c

我试图编写一个简单的游戏,这个游戏有一个玩家对象和一个使用循环创建的地板。我不知道为什么它的帧丢失得这么快。我有时钟滴答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)

这里有一个很好的学习点。优化代码的第一步是从循环中去掉不必要的数学运算。正如在评论中所建议的,如果您在每个帧计算中运行那个双循环,它可能会大大降低您的速度。也许其他事情也是如此

让我们假设您的“级别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)

您是否在每帧
level1
上进行双循环?在进入主循环之前,也许可以将其移动到初始化部分。我该如何做?抱歉,我是Python的新手。您需要编辑您的问题以包含整个代码,或者至少包括主循环。如果没有大部分代码,就不可能建议更改。双循环是二次时间的一个例子。对不起,stackoverflow是个新手,甚至不知道如何正确设置问题的格式
# 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)