2016-10-22 8 views
0

Ich erstelle eine Simulation mit tkinter und Pygame und ich habe derzeit Probleme, meinen Code zu optimieren. Das Programm benötigt 500-1000 „ant“ Sprites an die Oberfläche ziehen - das Verhalten dieser Ameisen wird durch diese Klasse definiertPygame-Code ist zu langsam

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] 

Bei der Initialisierung einer anderen Klasse, PyGameWin, Instanzen von Particle sind wie so erstellt:

self.ants = [Particle('black',1,1) for x in range(500)] 

in der Ereignisschleife des pygame Fenster, wenn eine "Start" -Taste in tkinter der folgende Code gedrückt wurde ausgeführt:

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

wo startAntMotion() Ist wie folgt definiert:

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

     pygame.display.update() 

Ich beabsichtige, mehr Threads für die restlichen 400 Objekte in self.ants in Zukunft hinzuzufügen. Wenn das Programm ausgeführt wird und der Startknopf in tkinter gedrückt wird, dauert es sehr lange, bis die "Ameisen" auf den Bildschirm gezogen werden. Gibt es eine Möglichkeit, den Code zu optimieren, damit er schneller ausgeführt werden kann? Der Code, der am längsten dauert, ist das tatsächliche Zeichnen der Sprites auf dem Bildschirm. pygame.image.load(ANT_SPRITE_PATH).convert_alpha()

Lassen Sie mich wissen, ob das Ihre Leistung gesteigert:

+4

Vielleicht versuchen Sie 'pygame.display.update()' nach der Schleife aufzurufen? –

+0

Ein Teil des Problems kann die Tatsache sein, dass 'pygame' Multithreading nicht unterstützt. Möglicherweise müssen Sie etwas wie [dies] (http://stackoverflow.com/a/7362993/355230) tun. – martineau

+0

Wenn die Leistung nach den anderen auf der Seite vorgeschlagenen Fixes immer noch ein Problem ist, sollten Sie möglicherweise zu einer OpenGL-Bindung wie pyopengl übergehen, bei der die 3D-Hardware für eine deutliche Leistungssteigerung beschleunigt wird. Es würde einen signifikanten Neuschreiben des Rendering-Codes erfordern, obwohl Sie pygame immer noch zum Erstellen des Fensters, zum Laden von Bildern und zur Behandlung von Ereignissen verwenden können. – CodeSurgeon

Antwort

1

Ich habe nicht genug + rep zu kommentieren, aber ein effizienter Weg, um das Laden von Bildern wird wie folgt geschrieben bekommen!

+1

Das hat perfekt funktioniert! Es machte das Sprite in ungefähr 2 Sekunden im Gegensatz zu 30-40 Sekunden. – joyalrj22

+0

EDIT: Ich meinte 10 Sekunden – joyalrj22

+0

Ich bin froh, geholfen zu haben! Hoffe es geht alles gut :) –