2016-10-22 102 views
0

我使用tkinter和Pygame創建了一個模擬,我目前在優化我的代碼時遇到了問題。該方案需要借鑑500-1000「蟻族」精靈的表面 - 這些螞蟻的行爲由此類Pygame代碼太慢了

class Particle(pygame.sprite.Sprite): 

    def __init__(self,color,width,height): 
     # call parent class constructor 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(ANT_SPRITE_PATH) 

     self.rect = self.image.get_rect() 
     self.WIDTH = width 
     self.HEIGHT = height 

    def updatePos(self,pos): 
     self.rect.x = pos[0] 
     self.rect.y = pos[1] 

定義在另一個類的初始化,PyGameWin,粒子的實例被創建,如下所示:

self.ants = [Particle('black',1,1) for x in range(500)] 
在pygame的窗口的事件循環

,當「啓動」在Tkinter的按鈕已被按下,執行以下代碼:

t = threading.Thread(target=self.startAntMotion) 
t.start() 

其中startAntMotion ()定義如下:

def startAntMotion(self): 
    for ant in self.ants[0:100]: 
     ant.updatePos(self.start) 
     self.surface.blit(ant.image,ant.rect) 

     pygame.display.update() 

我打算爲未來的self.ants中剩餘的400個對象添加更多的線程。當程序運行並且tkinter中的啓動按鈕被按下時,「螞蟻」被拖到屏幕上需要很長時間。有什麼方法可以優化代碼,使其運行速度更快?最長執行的代碼是精靈在屏幕上的實際繪製。

+4

也許嘗試在循環後調用'pygame.display.update()'? –

+0

問題的一部分可能是'pygame'不支持多線程。您可能需要執行類似[this](http://stackoverflow.com/a/7362993/355230)的操作。 – martineau

+0

如果在頁面上建議的其他修復之後性能仍然是問題,那麼可以考慮切換到OpenGL綁定,如pyopengl,這是3d硬件加速,以顯着提升性能。這將需要重新編寫渲染代碼,儘管您仍然可以使用pygame創建窗口,加載圖像和處理事件。 – CodeSurgeon

回答

1

我還沒有得到足夠的+代表發表意見,但要加載圖像的有效方式是這樣寫的:pygame.image.load(ANT_SPRITE_PATH).convert_alpha()

讓我知道,如果你提升性能!

+1

這工作完美!它在大約2秒內渲染了精靈,而不是30-40秒。 – joyalrj22

+0

編輯:我的意思是10秒 – joyalrj22

+0

很高興幫助!希望一切順利 :) –