Fehler in pygame?

  • siehe Newtron-Radio: Fehler in pygame?


    O.K. Also kurze Zusammenfassung:


    Nach einem[code=php]import pygame
    .
    .
    pygame.init()
    .
    .
    while True:
    .
    # tue irgendwas
    .[/php]Steigt die CPU-Last durch das Programm deutlich höher als zu erwarten.
    Erst mit
    [code=php]import pygame
    .
    .
    pygame.init()
    #pygame.mixer.init()
    pygame.mixer.quit()
    .
    while True:
    .
    # tue irgendwas
    .[/php]normalisiert sich das ganze wieder.



    Gruß,
    veloci

    Edited once, last by veloci ().

    • Official Post

    Wenn schon ein eigenerThread, dann fasse bitte das Problem kurz zusammen. Ich sehe da erstmal keinen "Fehler" drin.

    Quote from doku


    initialize all imported Pygame modules. No exceptions will be raised if a module fails, but the total number if successful and failed inits will be returned as a tuple. You can always initialize individual modules manually, but pygame.init()initialize all imported pygame modules is a convenient way to get everything started. The init() functions for individual modules will raise exceptions when they fail.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Das Problem hier ist, dass mit pygame.init() angeblich alle pygame-Module initialisiert werden, ein anschließendes pygame.mixer.get_init() aber None zurück gibt - per Definition

    Code
    If the mixer has not been initialized this returns None

    ist pygame.mixer aber nicht initialisiert. Dennoch steigt die CPU-Last erheblich an. Erst mit zusätzlichem pygame.mixer.init() und - falls keine Audioausgabe erwünscht ist - nachfolgendem pygame.mixer.quit() normalisiert sich die CPU-Belastung wieder. Für mich immer noch ein Fehler!

    Edited once, last by veloci ().

    • Official Post

    Grad mal auf meinem Pi probiert

    Code
    >>> import pygame
    >>> pygame.init()
    (6, 0)
    >>> pygame.mixer.get_init()
    (22050, -16, 2)
    >>>


    Bei mir wird der mixer initalisiert (frisch installierter pi), und ja ein pygame.mixer.quit() reduziert die CPU Last

  • Sorry, der Fehler saß vor der Tastatur
    hatte beim Testen in der interaktiven python-shell das pygame.init() vergessen :wallbash:
    Aber trotzdem ist die stark erhöhte CPU-Last - auch wenn nichts über den Mixer ausgegeben wird - ungewöhnlich und sollte bei 5 FPS keine 40-60% über Normal betragen.

    Edited once, last by veloci ().

    • Official Post

    Grad nochmal probiert:
    Mit Mixer:

    PHP
    import pygame
    pygame.init()
    while True:
        print "test"
    [/php]
    Ergebnis
    [code]
     4311 root      20   0 60948  19m  11m S   40,8  4,5   0:31.07 python


    ohne Mixer:

    PHP
    import pygame
    pygame.init()
    pygame.mixer.quit()
    while True:
        print "test"
    [/php]
    Ergebnis
    [code]
     4311 root      20   0 60948  19m  11m S   40,3  4,5   0:33.15 python


    Wie 40-50% Mehr sieht das nicht aus

  • bei mir: Newtron Radio auf Raspi Rev. B


    ohne pygame.mixer.quit()
    2761 root 20 0 75848 32m 18m S 16,9 8,7 0:10.76 newtron-radio.p
    mit pygame.mixer.quit()
    2774 root 20 0 75700 31m 18m S 10,8 8,6 0:07.72 newtron-radio.p


    entspricht ca. 56% mehr...

    Edited once, last by veloci ().


  • Aber ein "Fehler" ist es nicht ;)


    Wirklich?


    dann probier mal folgendes:
    [code=php]>>> import pygame
    >>> pygame.init()
    >>> pygame.mixer.music.load('irgend eine mp3 Datei')
    >>> pygame.mixer.music.play()
    [/php]


    (Die Musik beginnt zu spielen.)


    Bei mir zeigt top dann ungefähr folgendes (mit einer vbr-mp3):
    2530 pi 20 0 59640 19m 11m S 15,8 5,3 0:16.02 python


    Dann unterbreche die Ausführung mit <Ctrl>-Z
    (Die Musikwiedergabe wird unterbrochen, die Shell kann benutzt werden.)
    und hole den Prozess mit 'fg' wieder in den Vordergrund
    (Die Musik beginnt wieder zu spielen.)


    Jetzt zeigt top:
    2530 pi 20 0 59640 19m 11m S 11,5 5,3 0:21.35 python


    pygame.mixer ist weiterhin initialisiert, benötigt aber deutlich weniger CPU


    Erklärung???


    Das ist ungefähr der Weg wie ich überhaupt auf das Problem gestoßen bin. Siehe den Verlinkten Beitrag im ersten Post.
    Dort steht auch, dass bei der Initialisierung von pygame wohl irgendetwas schief laufen muß, denn sonst wäre die CPU-Last von vornherein niedriger...

    Edited once, last by veloci ().

  • Es ist eine Unart geworden, dass bei Python aus Bequemlichkeit oft alles importiert wird. Ich kann dieses Verhalten beim pygame mixer nicht nachvollziehen, evtl. gibt es Prozesse auf Deinem RasPi, die sich gegenseitig beeinflussen und Auswirkungen auf das Abspielen der Datei haben. Ich sehe da keinen Fehler bzw. Bug bei pygame.

  • Ich hab mit pygame eigentlich nichts am Hut aber in der Doku steht:

    Quote

    [font="sans-serif"]You may want to initalise the different modules seperately to speed up your program or to not use things your game does not.[/font]


    Also anstelle von sämtlichen pygame Modulen ggf. nur die, die gebraucht werden initialisieren zB ``[font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]pygame.mixer.[/font][font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]init[/font][font="sans-serif"]([/font][font="sans-serif"])``[/font]

  • OK,
    dann probiers halt mit
    [code=php]>>> import pygame
    >>> pygame.mixer.init()
    >>> pygame.mixer.music.load('irgend eine mp3 Datei')
    >>> pygame.mixer.music.play() [/php]


    Der Effekt bleibt der gleiche!
    nur ändert sich die CPU-last nach '<Ctrl>-Z ;fg'dann von ca. 11% auf ca 6%
    Das *IST* ein Initialisierungsfehler von pygame!

    Edited once, last by veloci ().

  • Also auch ich kann das nicht annähernd reproduzieren:


    Code
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pygame
    >>> pygame.mixer.init()
    >>> pygame.mixer.music.load('/home/pi/Python/Taster/test.mp3')
    >>> pygame.mixer.music.play()
    >>> pygame.mixer.music.stop()
    >>>
    KeyboardInterrupt
    >>>
    [1]+  Angehalten              python


    Last vor, während und nach dem Abspielen:


  • Ich habe es wieder und wieder probiert!
    1. Ist meine CPU Belastung von vornherein nur bei 4%
    2. ändert sich diese auf 2% sobald ich CTRL+Z mache
    3. ist sie wieder bei 4% wenn ich mit fg den Prozess fortführe


    Hast du vielleicht irgend einen Überwachungsdienst laufen? Welche Dienste laufen überhaupt?

  • Nein, Standard Raspian ohne X auf Raspi Rev. B auf dem nur mpd und sshd zusätzlich installiert/aktiviert wurden. Aber selbst ohne mpd ergibt sich das gleiche Bild.
    Audioausgabe erfolgt über Analog


    Auf einem zweiten Raspi B unter neu aufgesetztem Raspian das gleiche Bild...


    Nicht dass ihr mich jetzt falsch verstanden habt:


    • python-Shell neu starten!
    • Befehle eintippen
    • Während die Musik läuft CPU-Last des python-Prozesses ermitteln (bei mir ca. 11-12%)
    • Während die Musik noch läuft <Ctrl>-Z drücken
    • fg eintippen
    • Während die Musik wieder läuft CPU-Last des python-Prozess ermitteln bei mir ca. (6-7%)


    Denn wenn die laufende python-Shell einmal mit <Ctrl>-Z unterbrochen und mit fg wieder fortgesetzt bleibt die Last im laufenden Python dauerhaft niedrig. Auch weitere pygame.mixer.init() ändern daran nichts mehr.

    Edited once, last by veloci ().