geringe FPS

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Servus,

    ich hadere an geringen FPS bei einem kleinen Jump & Run Spiel welches in Python programmiert wurde. (7-8fps, mit einer Clockrate von 30fps)

    Die CPU-Auslastung ist bei etwa 30%, sprich an der CPU liegt es nicht - sondern wohl eher am Software-Rendering?
    Kann ich der GPU irgendwie mehr RAM zuweisen, sodass ich dementsprechend mehr FPS erhalte oder gibt es noch andere mögliche Vorschläge/Tipps?

    Würde mich freuen!

    Viele Grüße!

  • Kannst du das Script mal verlinken oder posten?

    Und wie wird es ausgegeben? HDMI oder über ein GPIO-Display?

    Wie viel RAM die GPU nutzen darf stellt man in /boot/config.txt ein - was aber nicht zwangsläufig bedeutet dass das Spiel dann schneller läuft, das ist ein Trugschluss.

  • Kann ich leider (noch) nicht posten - da es sich noch in Bearbeitung befindet. Ausgabe üblicherweise über HDMI - habe letztens aber nur via Remote-Desktopverbindung drauf zugegriffen. Dass es darüber etwas laggt ist mir bewusst, trotzdem sah ich die FPS-Anzeige welche relativ weit unten war. (7-8fps)

    Okey, ich dachte damit könnte man evtl. ein wenig an der FPS-Zahl schrauben. Gibt es denn sonst noch Tipps/Trick oder Ideen woran das liegen kann? Denke nicht dass das Raspberry "so" schwach ist?! Das Jump and Run läuft mit Python (pygame) ...

  • Mit pygame kann man die FPS in form von 'clock.tick' angeben und auslesen - aber kA wie Du das programmiert hast...

    Ich kenne das so, dass man die einzelnen Frames selber erstellen muss und somit eine while Schleife hat, in der unter anderem die pygame.event's behandelt werden.

    Beispiel:
    [code=php]//...

    # Frames per Second. Update Screen X times in one Sec. Below 3 is laggy
    FPS = 5

    # Enable FPS output to console? (True/False)
    debugFPS = True

    try:
    //...
    clock = pygame.time.Clock()
    #userevent on every 1000ms (1sec), used for second based events
    pygame.time.set_timer(USEREVENT+1, 1000)
    #userevent on every 60000ms (60sec), used for screensaver
    pygame.time.set_timer(USEREVENT+2, 60000)
    while running:
    clock.tick(FPS)
    if (time.time() - dictionary['pingtimestamp']) >= pingEvery:
    _ping(client)
    for event in pygame.event.get(): # User did something
    #printD("event: {}".format(event))
    if event.type == USEREVENT+1:
    second_based_event()
    if event.type == USEREVENT+2:
    minutes += 1
    elif event.type == pygame.QUIT:
    _exit()
    elif event.type == pygame.KEYDOWN:
    # https://www.pygame.org/docs/ref/key.html
    if event.key == K_ESCAPE:
    _exit()
    elif event.key == K_RIGHT:
    play_next(client)
    elif event.key == K_LEFT:
    play_prev(client)
    elif event.key == K_UP:
    volume_up(client)
    elif event.key == K_DOWN:
    volume_down(client)
    elif event.key == K_m:
    volume_mute(client)

    #if screensaver is enabled and the screen was touched,
    #just disable screensaver, reset timer and update screen
    #no button state will be checked
    elif event.type == pygame.MOUSEBUTTONDOWN and screensaver['state'] == True:
    minutes = 0
    screenSaver(False)

    #if screen was touched and screensaver is disabled,
    #get position of touched button, call on_touch(), reset timer and update screen
    elif event.type == pygame.MOUSEBUTTONDOWN and screensaver['state'] == False:
    pos = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1])
    minutes = 0
    on_touch(pos)

    #enable screensaver on timer overflow
    if screensaver['state'] == False and minutes >= screensaver_timer:
    screenSaver(True)

    update_screen()

    if debugFPS:
    print("frame rate: %.2f frames per second" % clock.get_fps())
    [/php]Quelle: mein TRON-Radio Script..

    Aber wie gesagt, ohne zu wissen wie Du das programmiert hast kann man zu deinen Fragen nur wenig sagen. Der Pi2 ist nicht zu schwach.

    Auch weiß ich nicht wie du die FPS misst... Wenn die Clockrate von pygame etwas anderes anzeigt als zB FRAPS dann wird es höchst wahrscheinlich an deinem XRDP liegen.

  • Genau so messen wir das. Wir haben eine Tickrate von 30fps - auf jedem anderen Rechner läuft dies auch mit den definierten 30FPS, auf dem Raspberry Pi kriege ich jedoch nur 8fps zustande, sieht also so aus als wie die Anzahl der Updates (analog wieoft er alles neuzeichnet) zuviel für das Raspberry Pi ist... Es wird quasi ständig alles neu gezeichnet, was der Raspberry Pi von der Grafik her nicht packt?!

    Es liegt auch definitiv nicht an XRDP, da wie gesagt die Anzeige ausschlaggebend ist und wir hier nur die genannte FPS-Zahl erhalten. Die Prozessorauslastung ist jedoch bei 20-30% - sprich die GPU packt das ganze Softwaremäßig nicht, oder?

  • Ich glaube nicht, dass die GPU das Problem ist. Sondern vielmehr der Mangel daran. Bei einem Video-Player-Projekt habe ich damit mal bittere Erfahrungen gemacht, als ich gstreamer zum dekodieren & anzeigen von h264-Videos benutzten wollte. Das klappt zwar wunderbar, aber die dekodierten Frames muessen einmal aus dem GPU-Speicher in den Hauptspeicher, und dann von dort wieder in die GPU gewuchtet werden.

    Das schafft der PI nicht mit der vollen Bildrate des Films.

    Nur wenn man die PI-eigenen OMX-Bibliotheken benutzt, kann man in der GPU dekodieren, und die Daten gleich darstellen - der Speicher-Roundtrip entfaellt, und Full-HD funktioniert.

    Etwas aenhliches koennte hier auch der Fall sein. Vielleicht hilft, Aufloesung reduzieren oder ein anderes, OpenGL-basiertes Framework wie pyglet.
    Automatisch zusammengefügt:
    Nachtrag: die Remote-Verbindung kann aber trotzdem auch noch einmal eine Rolle spielen, ich wuerde das in jedem Fall mal direkt an einem Monitor ausprobieren.

  • Also ich kriege mit dem Pi auch weit über 100 FPS mit pygame... Aber wie ich jetzt schon zum 3.mal schreibe: Keine Ahnung wie Ihr das programmiert habt... Nur weil es funktioniert muss es nicht zwangsläufig optimiert/optimal sein.

    Auch sagst du nichts darüber Welchen Pi du überhaupt hast oder was auf dem Pi sonst noch so läuft, LXDE vielleicht? Nicht zuletzt wird für XRDP auch ein Dienst benötigt der ebenfalls GPU / CPU / RAM des Pi's belastet - das ist Fakt.

    Wie man die GPU Auslastung auslesen kann weiß ich leider nicht - aber zumindest wie viel RAM die GPU verballert:

    Und dann könnte man auch damit experimentieren den CPU / GPU / RAM zu übertakten... aber das sollte die aller letzte Option sein.

  • Vielen Dank schonmal für eure Informationen. Das das ganze Softwaremäßig nicht optimal umgesetzt ist ist mir bewusst, dachte aber nicht dass es hier schon Probleme gibt. Ob 800x600 oder Fullscreen ändert an der ganzen Sache nichts.

    Ich werd das ganze mal direkt per hdmi testen und sonst rumbasteln, irgendwas klappt bestimmt.

    Mal ne andere Ansichtsweise, zur Sicherheit : Die CPU ist nicht überlastet, aber nur sehr wenige fps - Das ganze macht meiner Meinung nach wenig bis keinen Sinn trotzdem mal die Frage an die Experten: Kann es sein dass das Raspberry zu wenig Saft bekommt? (benutze momentan lediglich ein Handyladegerät direkt per Steckdose) Sollte eigentlich reichen.. Weiters wird bei den GPIO Pins noch ein wenig rausgeschickt. 3 LEDs werden angesteuert und paar passive Drucktaster... Kann doch damit eigentlich nichts zu tun haben aber lieber alles überprüfen...

  • Nein, so etwas hat damit nichts zu tun. Deine Vorstellung davon, dass nur die CPU Last die Systemlast praesentiert ist nicht korrekt. IO-Last kann die CPU Daumen drehen lassen, und trotzdem das System abwuergen. Je nach dem wie der Speichertransfer geloest ist, kann es zB sein, dass die CPU einfach andauernd auf einen der diversen (ich glaube 16, aber da halte ich nix ins Feuer fuer) DMA-Kanaele des PI wartet. Das taucht nicht als CPU-Last auf - und trotzdem bewegt sich nicht viel.

  • Wahnsinnig! Vielen Dank __deets__ und meigrafd! Soeben per HDMI direkt angeschlossen ohne RDP und es läuft ruckelfrei! bei 30fp. :)

    Somit ist das Problem (vorerst) gelöst - wenn nicht sogar komplett... Dass da wirklich der Remote-Zugriff soviele Ressourcen zerbaut ist krass...


    Merci!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!