Python 如何优化此代码以提高性能?

Python 如何优化此代码以提高性能?,python,optimization,pygame,Python,Optimization,Pygame,我正在用pygame制作一个游戏,完整的源代码可以在这里找到: 不幸的是,我遇到了一些帧速率问题,我读到的关于这类问题的所有信息都表明这是图形化的,即它与数学无关,与绘制精灵无关 因此,我已经将问题缩小到我的npc类的以下draw函数,它在我的“对象”列表中被称为每个npc的每个帧。它有很多精灵旋转,一个设置颜色键和一个重新调整大小。所有这些可能都非常昂贵,所以有没有办法重新编写以下代码以优化其性能 PS:抱歉,若我问的问题或代码不清楚,请指出是否有混淆之处,我将编辑我的问题 b = pyga

我正在用pygame制作一个游戏,完整的源代码可以在这里找到:

不幸的是,我遇到了一些帧速率问题,我读到的关于这类问题的所有信息都表明这是图形化的,即它与数学无关,与绘制精灵无关

因此,我已经将问题缩小到我的npc类的以下draw函数,它在我的“对象”列表中被称为每个npc的每个帧。它有很多精灵旋转,一个设置颜色键和一个重新调整大小。所有这些可能都非常昂贵,所以有没有办法重新编写以下代码以优化其性能

PS:抱歉,若我问的问题或代码不清楚,请指出是否有混淆之处,我将编辑我的问题

b = pygame.sprite.Sprite()
b.image = pygame.image.load("soldier.png").convert()
b.image.set_colorkey((0,0,0))

target = get_target(self)
if target != 0:
    angle = math.degrees(math.atan2(self.x - target[0], self.y - target[1])) + 90
    b.image = pygame.transform.rotate(b.image,angle)
    self.shoot(target)

if self.moving != False:
    if abs(self.x - self.moving[0]) < 1 and abs(self.y - self.moving[1]) < 1:
        self.moving = False
    else:
        self.move(self.moving)
        if target == 0:
            angle = math.degrees(math.atan2(self.x - self.moving[0],                   self.y - self.moving[1])) + 90
            b.image = pygame.transform.rotate(b.image,angle)

b.image = pygame.transform.smoothscale(b.image,(50,50))
b.rect = b.image.get_rect()
b.rect.topleft = [self.x - 20, self.y - 20]
window.blit(b.image, b.rect)
b=pygame.sprite.sprite()
b、 image=pygame.image.load(“soldier.png”).convert()
b、 图像。设置颜色键((0,0,0))
目标=获取目标(自我)
如果是目标!=0:
角度=数学度(数学atan2(self.x-target[0],self.y-target[1])+90
b、 image=pygame.transform.rotate(b.图像,角度)
自我射击(目标)
如果自动移动!=错误:
如果abs(self.x-self.moving[0])<1和abs(self.y-self.moving[1])<1:
self.moving=False
其他:
self.move(self.moving)
如果目标==0:
角度=math.degrees(math.atan2(self.x-self.moving[0],self.y-self.moving[1])+90
b、 image=pygame.transform.rotate(b.图像,角度)
b、 image=pygame.transform.smoothscale(b.image,(50,50))
b、 rect=b.image.get_rect()
b、 rect.topleft=[self.x-20,self.y-20]
blit(b.image,b.rect)

Woah Woah Woah。。。你是在每帧加载并转换.png吗

  • 不要那样做
  • 接下来,我建议不要从get_目标返回0,而应该返回None。那么您的下一行可以是:

    if target is not None:
    
    稍微快一点


    下次,试着分析代码的每一段。您可以使用来详细查看您的代码,或者只是。

    Woah Woah Woah。。。你是在每帧加载并转换.png吗

  • 不要那样做
  • 接下来,我建议不要从get_目标返回0,而应该返回None。那么您的下一行可以是:

    if target is not None:
    
    稍微快一点


    下次,试着分析代码的每一段。您可以使用来详细查看您的代码,或者只是。

    我更改了第二件事,但是我应该在哪里加载和转换.png,init函数?我试着将不同的行复制粘贴到init中,得到了一些非常奇怪的错误,有人能解释一下哪些行需要移动吗?在npc上把“b”作为一个变量(class?,不管你的
    self
    在这一点上是什么),在你的init类中做这个类的前三行,也把你的变量命名为“b”以外的东西!!!(.sprite是一个更好的选择)我做到了,现在它可以工作,直到我尝试移动npc。他从地图的右下角飞出,无限继续,直到它抛出这个错误:draw self.sprite.image=pygame.transform.rotate(self.sprite.image,angle)中的第53行错误:记忆不足将其作为一个新问题添加到更详细的信息中,如果我已经解决了您的性能问题,请在此处接受答案:)我更改了第二件事,但是我应该在哪里加载和转换.png,init函数?我试着将不同的行复制粘贴到init中,得到了一些非常奇怪的错误,有人能解释一下哪些行需要移动吗?在npc上把“b”作为一个变量(class?,不管你的
    self
    在这一点上是什么),在你的init类中做这个类的前三行,也把你的变量命名为“b”以外的东西!!!(.sprite是一个更好的选择)我做到了,现在它可以工作,直到我尝试移动npc。他从地图的右下角飞出,无限继续,直到它抛出这个错误:第53行,在draw self.sprite.image=pygame.transform.rotate(self.sprite.image,angle)错误:记忆不足将其作为一个新问题添加到更详细的信息中,如果我已经解决了您的性能问题,请在此接受答案:)