2016-08-27 7 views
0

Ich arbeite derzeit an einem Weltraum-Explorations-Spiel in 2D-Draufsicht. Ich habe ziemlich viele Planeten und da die Kartenspanne viel größer ist als die Anzeige, lande ich mit vielen Planetensprites, die außerhalb des Anzeigebereichs liegen. Im Moment nehme ich an, dass Pygame das Sprite nicht wirklich blit, wenn sie nicht im Display sind (wie ich es verstehe, Blitting und Zeichnen auf eine Oberfläche verlangsamt die Dinge ziemlich viel) ist das wahr? Oder müsste ich eine Bedingung hinzufügen, um zu prüfen, ob sich das Sprite vor dem Blit-Aufruf im Display befindet? Der Grund, warum ich frage ist, dass mein Spiel so funktioniert, dass jedes Mal, wenn ein Planet entdeckt wird, 2 neue erschaffen werden ... was bedeutet, dass das Spiel ziemlich groß und möglicherweise sehr langsam werden kann.Will Pygame blit Sprites mit einem Rect außerhalb des Displays

Vielen Dank

Antwort

1

Nein, es wird nicht blit die Bilder. Pygame ignoriert es einfach, wenn Sie versuchen, etwas außerhalb des Bildschirms zu blittieren. Es sollte Ihr Programm nicht verlangsamen, es sei denn, es gibt eine riesige Menge an Objekten, da es für pygame einen Bruchteil der Zeit braucht, um festzustellen, dass das Bild außerhalb des Bildschirms ist. Dies ist jedoch keine große Sache.

Realisierte meine Antwort fehlte Beweis (was schlecht ist, mkay ...), so lief ich einige Tests, um meinen Standpunkt zu beweisen. Ich habe 3 Bedingungen getestet: Blitting auf den Bildschirm, Blitting außerhalb des Bildschirms und nichts tun. Die Anzahl der Sekunden, die sie genommen haben, ist unbedeutend, da sie auf der Leistung meines Computers basieren (ein 5 Jahre alter Laptop), also suchen Sie stattdessen nach den Faktoren zwischen ihnen; Sie sollten für alle gleich sein.

5.000 blits

  • Innen: ,033265519510593734 Sekunden
  • Außen: ,002402466401003767 Sekunden
  • Nichts: ,00023237229449441657 Sekunden

500.000 blits

  • Innen: 3,639024520190433 Sekunden
  • Außen: 0,23328839021967726 Sekunden
  • Nichts: ,023549600850092247 Sekunden

50.000.000 blits

  • Innen: 360,48034191795153 Sekunden
  • Außen: 23,317473949049596 Sekunden
  • Nichts: 2,3507101910654455 Sekunden

Wie Sie sehen können, dauert das Blitting außerhalb des Bildschirms länger als nicht blitzend, aber es dauert nicht so viel Zeit, wie tatsächlich auf den Bildschirm zu blitzen. Blitzen außerhalb des Bildschirms ist kaum ein Kostenpunkt.

Für weitere Referenz, hier ist der Test, den ich erstellt:

setup = """ 
import pygame 
pygame.init() 
screen = pygame.display.set_mode((100, 100)) 
image = pygame.Surface((100, 100)) 
""" 

statement1 = """ 
for i in range(5000): 
    screen.blit(image, (0, 0)) 
""" 

statement2 = """ 
for i in range(5000): 
    screen.blit(image, (200, 200)) 
""" 

statement3 = """ 
for i in range(5000): 
    pass 
""" 

from timeit import timeit 

num_of_times = 10000 
inside = timeit(stmt=statement1, setup=setup, number=num_of_times) 
outside = timeit(stmt=statement2, setup=setup, number=num_of_times) 
nothing = timeit(stmt=statement3, setup=setup, number=num_of_times) 

print("Inside: {} seconds".format(inside/num_of_times)) 
print("Outside: {} seconds".format(outside/num_of_times)) 
print("Nothing: {} seconds".format(nothing/num_of_times)) 
+0

Okay, das ist, was ich dachte, aber da ich nicht wusste, was in der Blit Funktion versteckt ich war nicht sicher, ob es nicht tat, viele Berechnungen für nichts. – Sorade

+0

@Sorade Ich habe meine Antwort aktualisiert, um mehr Informationen und einen tatsächlichen Beweis dafür zu bekommen, dass ich richtig liege, also müssen Sie nicht blind einem verrückten Typen mit Internetzugang glauben. –

Verwandte Themen