当前位置: 首页 > 知识库问答 >
问题:

Pygame程序运行缓慢。为什么?

苏雅珺
2023-03-14

我在pyplay上做了一个Tamagotchi项目,在这个早期阶段,程序运行非常缓慢。你对原因有什么提示吗?还有,有没有办法加快速度?

到目前为止,这是我的代码

import pygame
import time

pygame.init()
def draw_grid(grid):
    for i in range(0,len(grid)):
        for j in range(0,len(grid[i])):
            area = (j*10, i*10, 8, 8)
            if grid[i][j] == 0:
                fill = True
                color = 0,0,0
            elif grid[i][j] == 1:
                fill = False
                color = 0,0,0
            elif grid[i][j] == 2:
                fill = False
                color = 255,0,0
            square = pygame.draw.rect(screen, color, area, fill)

def make_empty_grid(width,height):
    grid = []
    for i in range(height):
        zeros = []
        for j in range(width):
            zeros.append(0)
        grid.append(zeros)
    return grid

def draw_item(item, x, y):
    for i in range(0, len(item)):
        for j in range(0, len(item[i])):
            grid[i + x][j + y] = item[i][j]

size = width, height = 600, 400
#rects = 
screen = pygame.display.set_mode(size)

running = True

#beige background
background = 213, 230, 172 
black = 0, 0, 0
red = 255, 0, 0

image1 = [
         [1,0,1,1,1,0,1],
         [0,1,0,0,0,1,0],
         [1,0,1,0,1,0,1],
         [1,0,0,0,0,0,1],
         [1,0,1,1,1,0,1],
         [1,0,0,0,0,0,1],
         [0,1,1,1,1,1,0]
         ]

image2 = [
         [1,0,1,1,1,0,1],
         [0,1,0,0,0,1,0],
         [1,0,1,0,1,0,1],
         [1,0,0,0,0,0,1],
         [1,0,0,1,0,0,1],
         [1,0,0,0,0,0,1],
         [0,1,1,1,1,1,0]
         ]

bars = [
       [2,2,2,2,2,2,2,2,2,2],
       [2,2,2,2,2,2,2,2,2,2]
       ]


tamaPosX = 27
tamaPosY = 8

curImage = image1
while running:
    # Get the window input
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                tamaPosX -= 1
            if event.key == pygame.K_RIGHT:
                tamaPosX += 1
            if event.key == pygame.K_UP:
                tamaPosY -= 1
            if event.key == pygame.K_DOWN:
                tamaPosY += 1

    screen.fill(background)

    grid = make_empty_grid(width,height)

    if curImage is image1:
        curImage = image2
    else:
        curImage = image1

    draw_item(curImage, tamaPosY, tamaPosX)
    draw_item(bars, 35, 1)

    draw_grid(grid)

    pygame.display.flip()

共有2个答案

沃皓轩
2023-03-14

您不需要每次都重新计算空网格。将其存储在一个表面中作为背景图像,然后您可以每次将其存储到屏幕上,而不是清除它,重新计算它,然后将其删除。此外,当绘制项目时,只需绘制项目而不是整个屏幕。您可以使用display.update并传递项目,因为它们是唯一正在变化的东西。

您还应该将项目存储为曲面或精灵,而不是每次通过循环都重新计算它们。

齐意致
2023-03-14

您可以尝试分析代码:

https://docs.python.org/2/library/profile.html

主要是因为有很多嵌套for循环。其中有些似乎没有必要。嵌套for循环在Python中并不快速。

您的宽度和高度是恒定的,您不需要在每个刻度处创建一个全新的空网格。

import copy

empty_grid = [[0] * width for _ in range(height)]
def make_empty_grid():
    return copy.deepcopy(empty_grid)

与其将项目复制到网格中,然后绘制网格,为什么draw_item不直接调用pygame.draw呢?事实上,你在整个网格上迭代了两次——一次是把项目放在网格中,一次是画网格。

编辑:这可能是一个不好的建议,我看到即使是值为0的网格元素也被绘制成与背景不同的颜色。我不知道你在做什么。

 类似资料:
  • 我试图用映射器和还原器运行一个作业,但映射器运行得很慢… 如果对于相同的输入,我禁用精简器,映射器在3分钟内完成,而对于映射器-精简器作业,即使在30分钟结束时,映射器仍未完成。 此外,Jobtracker日志还填充有: 有人能说出哪里可能出了问题吗

  • 我正在构建自己的android应用程序,当我把它放在我的Nexus 5和Xperia Neo上时效果很好,但在Nexus 4或Galaxy S3上效果很慢。我不知道发生了什么。你能帮我吗?我正在使用android:minSdkVersion=“14”和android:targetSdkVersion=“17”,片段和一个抽屉布局。 包装测试。Droidlogin; 导入android.conten

  • 问题内容: 是因为我们应该加载类(例如),创建实例,然后搜索适当的方法,打包参数,然后仅调用方法?因此,大多数时间都花在了这些操作上,而不是花在对象上的显式方法调用上,对吧? 问题答案: 使用反射时,每次执行时都需要验证您执行的每个步骤。例如,当您调用一个方法时,它需要检查目标是否实际上是该方法的声明者的实例,是否具有正确数量的参数,每个参数是否具有正确的类型,等等。 绝对没有内联或其他性能技巧的

  • 问题内容: (重要)编辑3: 单独运行testajax2.php而 不是 Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询耗时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。)

  • 使用以下代码: 我得到这个输出: 换句话说,执行需要30秒。机器是2015 Macbook Pro,Java 1.8.0_60。 为什么这需要这么长时间?

  • 问题内容: 我有一些针对angularjs应用运行的简单的业力/茉莉单元测试。我使用最新版本的Chrome,并在WebStorm IDE中运行测试。 有时测试套件运行非常快(0.24秒) 有时,针对完全相同的代码的完全相同的测试套件运行非常缓慢(120秒) 我尝试了所有常识性修复。我在网上搜寻了一下,以发现我在做什么错。 为什么我的测试运行如此缓慢? 问题答案: 答案很简单。 我正在使用Chrom