Seite 1 von 2

Verfasst: Montag 11. September 2006, 15:44
von KC25m
sorry wenn ich mich einmisch aber habe da nich einen Tip ...
Langsamme system werden stark beansprucht durch dem befehl pygame.display.flip() !
Pygame.display.flip() sollte in der regel nur dann genommen werden wenn es dadrum geht ein DoubleBuffer nach vorne zu bringen .

Wenn ihr für ein System speed braucht nutzt die möglichkeit der Dirtyrects ....

Code: Alles auswählen

Dirtyrect=screen.blit(img,(x,y))
pygame.display.update(dirtyrects)
Es beschleunigt die grafikausgabe ungemein .

Programmiere gerade auf einen Via EPia board mit 600MHz und es macht riesen unterschiede ob der ganze bildschirm geupdatet wird oder nur einzelnde bereiche.

Verfasst: Montag 11. September 2006, 18:46
von Nirven
Hm, wo hier grade die Rede von performance ist:

Hat jermand eine Idee warum mein (ziemlich) einfaches Übungsprogramm ca viermal so schnell läuft, wenn sich etwas anderes (Skype oder Thunderbird benachrichtigung) in den Vordergrund drängt?

Ich hab zum Üben aus den PyGame-Tutorials ein Progrämmchen gebastelt, bei dem ein paar Kugeln durch die Gegend fliegen und wenn man auf so eine Kugel klickt, verschwindet sie. Das ganze habe ich als Fullscreen, den genauen Code habe ich auf dem anderen Rechner, kann ich momentan leider nicht posten. Vielleicht hat ja auch so jemand eine Idee.

Das ganze läuft grademal bei ca 35 fps (für so ein kleines Programm ziemlich wenig, wie ich finde). Aber wenn sich ein Kontakt bei Skype einloggt und so ein Benachrichtigungsfenster von Skype davorschiebt, fliegen die Kugeln plötzlich mit 140 fps über den Bildschirm. Sobald sich das Benachrichtigungsfenster wieder zurückzieht geht auch die Performance nach unten. Ich versteh irgendwie nicht, warum es schneller wird, wenn sich was anderes davor schiebt. Wäre echt dankbar wenn mir jemand helfen kann... Code leifere ich wie gesagt gerne nach.

Verfasst: Dienstag 12. September 2006, 10:21
von KC25m
Performance hat auch viel mit dem Bildschirmmodus zutun ,
Es gibt ja Software , hardware unterstützung.
Bei mir auf mein WindowsSystem habe ich festgestellt wenn etwas alpha hat ist es besser einen software screen zu nutzen.
Unter Linux auf dem Via EPIA ist es besser ein hardware screen zu benutzen.
Vieleicht soltest du einfach mal den Bildschidm umstellen...
Voreingestellt unter pygame.FULLSCREEN ist ein Software Screen.
Heist alles wird durch die Software geblittet...
pygame.HWSURFACE , pygame.DOUBLEBUF sind noch zwei weiter modies ...

FULLSCREEN ist bei mir auf dem windows system am schnellste da win kein Alphablitting hardware mässig unterstützt und die software dann schneller arbeitet.

Wenn ich ich recht entsinne ist HWSURFACE und DOUBLEBUF auch mit dem VSync syncron..

Verfasst: Dienstag 12. September 2006, 10:57
von Nirven
Danke, das hat schonmal etwas geholfen. :)

Mit DOUBLEBUF komme ich jetzt auf 75 fps. Mit HWSURFACE alleine sogar auf 90fps, aber dann flackert das Bild total.

Aber mit SWSURFACE (dem "Standard") komme ich halt auf 120 fps, wenn sich ein anderes Fenster davor schiebt. Die Software gibt es also her, nur igrendwas funktioniert anscheinend nicht ganz richtig. Mal weiter probieren.

Verfasst: Dienstag 12. September 2006, 15:12
von KC25m
guck mal in PyGames nach get_fps , get_ticks und so da gab es eine funktion die das ganze auf eine Maximale FPS beschränken läst...

Ich habe inmo keine erklärung wieso es so ist das wenn ein externes event passiert deine grafikkarte auf einmal rennt wie sonstwas.
Kann das ganze leider auch nicht nachvolziehen.

Verfasst: Dienstag 12. September 2006, 20:52
von Leonidas
Nirven hat geschrieben:Aber mit SWSURFACE (dem "Standard") komme ich halt auf 120 fps, wenn sich ein anderes Fenster davor schiebt. Die Software gibt es also her, nur igrendwas funktioniert anscheinend nicht ganz richtig.
Das ist ganz einfach: wenn ein anderes Fenster sich davor schiebt, muss kein Bild von deinem Programm mehr aufgebaut werden (weil es ja verdeckt ist und du also sowieso nicht merkst ob es angezeigt wird oder nicht), somit steigt die Geschwindigkeit deines Programmes.

Verfasst: Dienstag 12. September 2006, 21:34
von Nirven
"Kein Bild mehr aufgebaut werden" stimmt nicht so ganz, die Skype-Benachrichtigung bedeckt ja nur einen kleinen Teil des Bildschirms. Auf dem Rest sehe ich die Bälle nur so durch die Gegend flitzen, das Programm läuft also und generiert auch die Bilder.

@KC25m: Ja, mit der PyGame-Methode laß ich mir die fps ausgeben (werden auch oben rechts im Programm angezeigt). Beschränken wäre jetzt wirklich eine Option, bei 35 fps hat sich das irgendwie nicht gelohnt :D

Verfasst: Dienstag 12. September 2006, 21:45
von Leonidas
Nirven hat geschrieben:"Kein Bild mehr aufgebaut werden" stimmt nicht so ganz, die Skype-Benachrichtigung bedeckt ja nur einen kleinen Teil des Bildschirms. Auf dem Rest sehe ich die Bälle nur so durch die Gegend flitzen, das Programm läuft also und generiert auch die Bilder.
Ja. Dann modifiziere ich "Kein Bild mehr aufgebaut werden" zu "der überdeckte Teil des Bildes wird nicht mehr aufgebaut". Ich kanns leider grad nicht testen, aber versuch mal mit einem anderen Fenster immer mehr von deinem Pygame-Fenster zu überdecken. Dann müsste, je mehr du vom Fenster überdeckt wird, die Anzahl der FPS steigen. Versuchs einfach mal aus. Wenns nicht stimmt, dann habe ich auch keine andere Erklärung.
Nirven hat geschrieben:Ja, mit der PyGame-Methode laß ich mir die fps ausgeben (werden auch oben rechts im Programm angezeigt). Beschränken wäre jetzt wirklich eine Option, bei 35 fps hat sich das irgendwie nicht gelohnt :D
Wenn du das irgendwann aber trotzdem mal willst - pygame.time.Clock.tick() ist genau dafür da.