ich habe heute meine ersten Python-Schritte unternommen und muss sagen, dass es eine Sprache ist, nach der ich schon lange gesucht habe. In C# hab ich häufig stundenlang nach irgendwelchen Krams gegoogelt, der mit dem eigentlichen Problem rein gar nichts zu tun hatte.
Nun bin ich bei meinen ersten Schritten und Threading auf folgendes Verhalten gestoßen, wobei ich gerne auf Eure Erfahrung oder Wissen zurückgreifen möchte.
In meinem Programm versetze ich einen Punkt zufällig nach oben, unten, rechts, links was dann wie ein zitternder Punkt aussieht. Zusätzlich zeigt das Programm die Anzahl dieser Aktualisierungen/Punktdarstellung pro Sekunde an.
Die "Punktdarstellung" lief zunächst im Hauptprogramm unter einer "while True"-Schleife und zeigte über 3000 Punkte pro Sekunde an, wobei ich schon nicht schlecht gestaunt habe. Der Punkt wurde so schnell aktualisiert, dass man den Eindruck hatte, da tanzen 2-3 Punkte über den Bildschirm.
Die "Frame-Anzeige" habe ich mit einem Thread umgesetzt. Nun dachte ich, ich packe die Punktdarstellung auch in einen Thread, doch plötzlich werden die Punkte nur noch ca. 200 Mal pro Sekunde aktualisiert.
Nun die Frage, woran liegt das? Ist der Hauptthread normal soviel schneller? Oder liegt es daran, das der Thread nun eine weitere "while True"-Schleife besitzt?
Code: Alles auswählen
import time
import sys
import random
#import and init pygame
import pygame
pygame.init()
#threading
from threading import Thread
#create the screen
window = pygame.display.set_mode((640, 480))
#festgelegte/globale Werte
MaxX = 639
MaxY = 479
Frames = 0
oldFrames = 0;
#pixel startposition
x = random.randint(0,MaxX)
y = random.randint(0,MaxY)
#Berechnet die neue Pixelposition
def newpos():
z = random.randint(1, 4)
global y
global x
if z == 1:
y = y - 1
if y < 0:
y = MaxY
if z == 2:
x = x + 1
if x > 639:
x = 0;
if z == 3:
y = y + 1
if y > 479:
y = 0
if z == 4:
x = x - 1
if x < 0:
x = MaxX
#schreibt Text auf die Grafikanzeige
def textout(fps,r,g,b):
global MaxX
global MaxY
font=pygame.font.SysFont("arial",30)
text=font.render(str(fps), 1,(r,g,b))
window.blit(text, (MaxX-100, MaxY-30))
#Thread zur Frame-Anzeige
def showfps():
global Frames
global oldFrames
textout(oldFrames,0,0,0)
FrameStamp = Frames
textout(FrameStamp,255,255,255)
Frames = 0
oldFrames = FrameStamp
time.sleep(1)
showfps()
#Thread Punktdarstellung
def DrawPoint():
global x
global y
global Frames
while True:
pygame.draw.line(window, (0,0,0), (x,y), (x+1,y))
newpos()
pygame.draw.line(window, (255,255,255), (x,y), (x+1,y))
pygame.display.flip()
Frames = Frames + 1
#Thread Frame-Anzeige starten
t1 = Thread(target=showfps)
t1.daemon = True
t1.start()
#Thread Punktdarstellung starten
t2 = Thread(target=DrawPoint)
t2.daemon = True
t2.start()
#input handling
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
else:
print (event)