2013-02-10 148 views
1

我在pygame有一个程序。我有很多不同的部分,其中两个如下所示。在第二种情况下,游戏正常进行,但在第一种情况下,即使它具有相同的打勾速度,它也非常滞后。有什么我失踪?顺便说一下,每个游戏循环周期中只有其中的一个正在执行。请注意,在两者之间重复以#结尾的行。Pygame真的很慢

for event in pygame.event.get():# 
    if event.type==pygame.QUIT:# 
     pygame.quit()# 
     sys.exit()# 
    if event.type==pygame.KEYDOWN:# 
     if event.key==pygame.K_ESCAPE:# 
      pygame.quit()# 
      sys.exit()# 
for ball in balls:# 
    ball.update(winrect, walls)# 
window.fill(WHITE)# 
for box in boxes:# 
    pygame.draw.rect(window, box[1], box[0])# 
for wall in walls:# 
    if wall.orientation==0:# 
     pygame.draw.rect(window, BLACK, (wall.left, wall.top, wall.ttopleft, wall.height))# 
     pygame.draw.rect(window, BLACK, (wall.bbottomright, wall.top, wall.right-wall.bbottomright, wall.height))# 
    else:# 
     pygame.draw.rect(window, BLACK, (wall.left, wall.top, wall.width, wall.ttopleft))# 
     pygame.draw.rect(window, BLACK, (wall.left, wall.bbottomright, wall.width, wall.bottom-wall.holesize))# 
for ball in balls:# 
    pygame.draw.circle(window, ball.color, ball.center, round(ball.width/2))# 
    pygame.draw.circle(window, BLACK, ball.center, round(ball.width/2), 2)# 
window.blit(coverso, winrect) 
window.blit(texts['complete'][0], texts['complete'][1]) 
window.blit(stuff[0], stuff[1]) 
pygame.display.update()# 
pygame.time.Clock().tick(100)# 

,第二个:

#event loop 
    for event in pygame.event.get():# 
     if event.type==pygame.QUIT:# 
      pygame.quit()# 
      sys.exit()# 
     if event.type==pygame.KEYDOWN:# 
      if event.key==pygame.K_ESCAPE:# 
       mode='pause'# 
    #updates 
    updates=[] 
    for wall in walls: 
     wall.update() 
    for ball in balls:# 
     updates.append(ball.update(winrect, walls))#similar 
    #Seeing if won 
    won=True 
    for update in updates: 
     if not update: 
      won=False 
    if won: 
     if levels[loadinglevel][4]==0: 
      levels[loadinglevel][4]=1 
     levels[loadinglevel-1][4]=2 
     mode='complete' 
     stuff=getcomplete(loadinglevel, coins, bigfont, texts['complete'][1].bottom+100, winrect.centerx) 
     for wall in walls: 
      wall.bbottomright=100000 
      wall.ttopleft=90000 
     coins+=loadinglevel 
    #blitting 
    window.fill(WHITE)# 
    for box in boxes:# 
     pygame.draw.rect(window, box[1], box[0])# 
    for wall in walls:# 
     if wall.orientation==0:# 
      pygame.draw.rect(window, BLACK, (wall.left, wall.top, wall.ttopleft, wall.height))# 
      pygame.draw.rect(window, BLACK, (wall.bbottomright, wall.top, wall.right-wall.bbottomright, wall.height))# 
     else:# 
      pygame.draw.rect(window, BLACK, (wall.left, wall.top, wall.width, wall.ttopleft))# 
      pygame.draw.rect(window, BLACK, (wall.left, wall.bbottomright, wall.width, wall.bottom-wall.holesize))# 
    for ball in balls:# 
     pygame.draw.circle(window, ball.color, ball.center, round(ball.width/2))# 
     pygame.draw.circle(window, BLACK, ball.center, round(ball.width/2), 2)# 
    pygame.display.update()# 
    pygame.time.Clock().tick(100)# 
    if mode=='pause': 
     window.blit(coverso, winrect) 
+0

你试过运行'cProfile'要找准问题的功能(S)? – 2013-02-10 03:51:14

+0

@Mike我从来没有听说过。你能把我必须做的事情放到其中一个程序中吗?谢谢。 – PygameNerd 2013-02-10 15:43:39

+0

不可能告诉发生了什么事。看看[你如何能够剖析Python脚本?](http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script)和[RunSnakeRun](http:// www.vrplumber.com/programming/runsnakerun/)找到瓶颈。 – sloth 2013-02-10 18:46:58

回答

0

在不重复第一部分的唯一线路是这些:

window.blit(coverso, winrect) 
window.blit(texts['complete'][0], texts['complete'][1]) 
window.blit(stuff[0], stuff[1]) 

如果你不使用alpha是建议您在创建曲面时使用surface.convert()

如果您使用的α如果能使用colorkeys因为他们快得多,甲型表面。

为了加速计算,我推荐使用Psyco

http://www.psyco.sourceforge.net/

+0

事实证明,我意外地在同一时间打印了一个极端大的矩形。由于体积庞大,需要很长时间才能完成。不过谢谢。 – PygameNerd 2013-04-11 16:48:03

0

添加到什么alexpinho98说,你不必使用colorkeys与阿尔法表面。您可以改为使用surface.convert_alpha()。

使用下面的代码为您节省一些时间和反复让你不必键入.convert_alpha():

def loadify(imgname): 
    return pygame.image.load(imagename).convert_alpha()