2016-10-24 5 views
0

Ich entwickle ein einfaches Kachel-Spiel, das ein Rasterbild anzeigt und es mit aufeinanderfolgenden Schichten von Bildern malt. So haben- ichPygame: langsame Leistung mit pygame.Surface und convert_alpha()

list_of_image_tiles = { GRASS: pygame.image.load('/grass.png').convert_alpha(), TREES: pygame.image.load('/trees.png').convert_alpha(), etc} 

Dann später blitten ich these-

DISPLAYSURF.blit(list_of_images[lists_of_stuff][TREES], (col*TILESIZE,row*TILESIZE)) 

DISPLAYSURF.blit(list_of_images[lists_of_stuff][GRASS], (col*TILESIZE,row*TILESIZE)) 

Beachten Sie, dass der Kürze halber habe ich nicht viel Code enthalten, aber es ist im Grunde Werk außer Leistung quälend langsam ist. Wenn ich die DISPLAYSURF-Stuff-Performance ausspringe, springt die Performance nach vorne, also denke ich, dass ich einen besseren Weg brauche, um das DISPLAYSURF-Zeug oder möglicherweise die pygame.image.load-Bits (is convert_alpha()) zu machen -Image-Ansatz?)

Ich lese etwas namens psycho könnte helfen, aber nicht sicher, wie man das passt. Irgendwelche Ideen, wie die Leistung am besten zu verbessern.

Antwort

2

Es gibt ein paar Dinge, die Sie tun können.

  1. Führen Sie die "Multi-Layer" blit nur einmal zu einem surface dann blitten nur, dass surface jeden Rahmen zum DISPLAYSURF.
  2. Identifizieren Sie Teile des Bildschirms, die aktualisiert werden müssen, und verwenden Sie screen.update(rectangle_list) anstelle von screen.flip().

bearbeiten Beispiel 1. Hinweis hinzuzufügen: Sie nicht viel von Ihrem Code gegeben hat, so dass ich passen diese nur mit, wie ich es tun.

# build up the level surface once when you enter a level. 
level = Surface((LEVEL_WIDTH * TILESIZE, LEVEL_HIGHT * TILESIZE)) 
for row in range(LEVEL_HIGHT): 
    for col in range(LEVEL_WIDTH): 
     level.blit(list_of_images[lists_of_stuff][TREES], (col * TILESIZE, row * TILESIZE)) 
     level.blit(list_of_images[lists_of_stuff][GRASS], (col * TILESIZE, row * TILESIZE)) 

dann in Hauptschleife während des Ziehens Teil

# blit only the part of the level that should be on the screen 
# view is a Rect describing what tiles should be viewable 
disp = DISPLAYSURF..get_rect() 
level_area = Rect((view.left * TILESIZE, view.top * TILESIZE), disp.size) 
DISPLAYSURF.blit(level, disp, area = level_area) 
+0

Danke für die Anregung, können Sie mir zeigen etwa, was diese beiden Ansätze wie Syntax in Bezug auf meine Code weise aussehen könnte? – SamChancer

+0

hinzugefügt Beispiel von 1. Für Nummer 2, es hängt völlig davon ab, wie Sie wissen, was zu zeichnen ist und erfordert oft, dass Sie Ihr Spiel erstellen, das Update 'Rect' zurückgibt, so dass Sie Ihre Liste erstellen können, um an 'screen.update()' übergeben . – cmd

+0

Vielen Dank, ich kann das Beispiel mit dem, was ich bisher gebaut habe, eine große Hilfe sein. – SamChancer

Verwandte Themen