Pygame Screen überschreiben - Performance

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
oml221
User
Beiträge: 7
Registriert: Mittwoch 7. Oktober 2020, 20:38
Wohnort: Quito, Ecuador

Hallo Zusammen,

ich experimentiere zur Zeit mit Pygame und habe hierzu mal zwei kurze Fragen:

1)
Zu Beginn meines kleinen Programmes erzeuge ich einen schwarzen Screen, den ich dann mittels screen.blit() Stück für Stück mit Grafiken befülle - teilweise auch übereinander, was sehr gut funktioniert.
Das mache ich dann zur Laufzeit immer und immer wieder - sprich, der ganze Bildschirm wird immer und immer wieder mit Grafikstücken überdeckt.

Wie darf ich mir das nun "Körperlich" vorstellen?
Werden die Grafiken bei jedem Durchlauf "gestapelt", d.h. nach einer Stunde Laufzeit liegen tausende Grafiken übereinander, oder "merkt" sich das Programm ausschließlich das Sichtbare und die anderen Informationen sind verloren?

2)
Um zu verhindern, dass mein "Spieler" z.B. in einen Baum läuft, mache ich um die Figur vier kleine Rechtecke pygame.Rect() die ich dann auf Kollision mit anderen Rechtecken überprüfe.
Da sich die Spielfigur bewegt, erzeuge ich bei jedem Schleifendurchlauf vier neue Rechtecke um die Position der Figur z.B. spieler_r = pygame.Rect(x+25, y+5, 5, 40)
Nun im Grunde dieselbe Frage wie oben: Bleiben diese Rechtecke bestehen - sammeln sich also im Laufe der Zeit zu tausenden auf dem Bildschirm an - oder werden diese ersetzt (sie sind ja unsichtbar für mich - kann sie daher nicht sehen)?

Ich hoffe, die Fragen sind nicht zu naiv - aber es sind meine ersten Gehversuche mit Pygame bzw. Python und ich bin bis jetzt wirklich restlos begeistert!
Danke im Voraus für eure Unterstützung.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oml221: Ad 1) Ein Pygame `Surface` ist im Grunde einfach ein 2D-Array mit Pixeldaten. Für jede Koordinate gibt es ein Pixel im Speicher. Wenn man die Werte für das Pixel durch andere Werte überschreibt, wird der Speicherinhalt an der Stelle ersetzt. Da sammelt sich nichts an.

Ad 2) Auf dem Bildschirm können sich `Rect`-Objekte nicht ansammeln, denn die haben nichts mit dem angezeigten zu tun. Und im Speicher verhalten die sich wie jedes andere Objekt in Python auch. Solange Du vom Programm aus irgendwie Zugriff darauf hast, weil sie an einem Objekt als Attribut gespeichert sind, oder in einer Datenstruktur (Liste, …) stecken, belegen sie Speicher. Sobald kein Weg mehr besteht darauf zuzugreifen, kann sich die automatische Speicherbereinigung von Python darum kümmern und den Speicher wieder für andere Objekte freigeben.

Es gibt verschiedene Module um zu schauen wo der Speicher von einem Programm verbraucht wird. Sogar eines in der Standardbibliothek: `tracemalloc`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
oml221
User
Beiträge: 7
Registriert: Mittwoch 7. Oktober 2020, 20:38
Wohnort: Quito, Ecuador

Hallo __blackjack__,

herzlichen Dank für die schnelle und kompetente Antwort!!
Antworten