[Entwicklung] RPi-Tron-Radio. Eine weitere Abkopplung

  • Ich bastel gerade just 4 fun an einem Recode des Originals, in dem ich eigentlich keine starren Skin-Bilder nutzen möchte, eben weil die Skin-Bilder nur für eine Auflösung passen...


    Auch wären ein paar Animationen nicht schlecht wie zB den Track-Titel - der auf so kleinen Displays selten vollständig dargestellt werden kann - von rechts nach links durch zu scrollen. Oder ein durchscrollen der Playlisten/Tracks wäre auch cool :geek:



    Davon abgesehen hab ich im laufe des Umbau's noch ein paar andere Sachen geändert:


    [hr]
    [hr]


    Bisheriges Changelog:

    • Beta7:

      • Allgemein den Code aufgeräumt und Einrückungen usw ausgebessert.
        Mehr Features von pyGame verwendet (wie zB pygame.time.Clock()).
        Allgemein so gut es geht auf 'subprocess' verzichtet.
      • Fehlermeldungen werden abgefangen und auf der Konsole ausgegeben. (Script läuft dadurch trotzdem weiter)
      • Natives steuern des MPD's übers mpd2 Python Module, anstelle der subprocess mpc Shellbefehle... Dadurch wäre es nun auch möglich einen anderen MPD übers Netzwerk zu steuern.
        Das senkt die CPU Belastung und macht die Bedienung auch bisschen flüssiger. Vorher waren nur 4-5 FPS möglich, aktuell bin ich bei ca. 9 FPS und kann evtl. noch was rauskitzeln - was nämlich nur an der update_screen() Funktion liegt. Würde man zB das ständige laden der Skin Bilder entfernen wärs noch mal 3 FPS schneller (und auch weniger CPU Last).
      • 'global' Variablen durch Dictionary's ersetzt...
        Dadurch wird es flexibler, eindeutiger und man brauch nicht Variablen die man in einer Funktion ändern möchte extra 'global' setzen (und somit auch nicht vergessen dies zu tun), und es kommt auch zu keinem Konflikt.
      • CPU-Temperatur wird über /sys/class/thermal/thermal_zone0/temp ausgelesen...
        Im Original wird vcgencmd genutzt was aber unnötige Last verursacht.
      • CPU Freq. im 2.Fenster eingefügt.
      • RAM Werte im 2. Fenster eingefügt.
      • Volume Wiederherstellung beim wiederholten drücken auf Mute.
        Drückt man ein mal auf Mute wird der letzte Wert gespeichert. Drückt man erneut auf Mute wird die vorherige Lautstärke wieder aktiviert.
      • Pause und Resume auf dem 'pause' Knopf.
      • Lauter/Leiser/Mute/Next/Prev ist auch über Tastatur möglich (m für Mute, das andere über die Pfeiltasten)
      • Screensaver von Weiß auf Schwarz geändert - somit brennt sich nichts ein.
      • IP wird nur ein mal beim ausführen des Scripts ausgelesen und dann in eine Variable gespeichert. Hat noch mals 1-2 FPS ausgemacht.
      • Default Playlist die beim starten des Scripts abgespielt wird...
        Lass ich das weg, musste ich bei mir jedes mal manuell über die Konsole eine add'en um was abspielen zu können :-/
      • Falls Titel oder Station Name zu lang ist wird er abgeschnitten und mit "..." am Ende gekennzeichnet. Falls er aber nicht zu lang ist wird auch nichts abgeschnitten oder verpunktet ;)


    • Beta8:

      • update_screen() weiter optimiert und change_skin() ausgelagert.
        Hat noch mals 3 FPS gebracht.
      • Station und Title auf utf-8 umgestellt (Umlaute).
      • Durch einfügen von .convert() hinter jeder pygame.image.load() Zeile nochmals 2-4 FPS rausgekitzelt. (details dazu >hier< unter "Use surface.convert().")
        Bis hier hin sind nun fast 16 FPS möglich, also mehr als das dreifache wie beim Original :cool:
        "Dirty rect animation" bringt leider nichts da jedes mal das Skin Bild neu gerendert werden muss und somit +/-0 FPS dabei rauskommt (bzw sogar zZt 1-2fps langsamer)... Wen es trotzdem interessiert:



    • Beta9:

      • Erster Versuch automatisch den passenden Treiber herauszufinden und diesen entsprechen zu laden. Vorlage: http://www.karoltomala.com/blog/?p=679
        Dabei versucht das Script erst 'fbcon' und danach 'directfb' zu laden und die Bildschirmauflösung automatisch zu ermitteln.
        Auch erkennt das Script nun ob es tatsächlich Standalone gestartet wurde oder über zB X11-Forwarding und falls kann man die Fenstergröße ändern..
      • Überprüfung ob die Skin Bilder geladen werden konnten...
      • Lauftext zunächst auf lema67's Art geändert damit dieser nicht über den Skin-Rand drüber scrollt.
        Wahlweise einstellbar ob überhaupt gescrollt werden soll.
      • ..Wusstet ihr eigentlich schon das man auch die Linux-System Fonts verwenden kann und somit keine extra font Dateien braucht? :cool: Nur muss man dann leider Abstände usw anpassen wenn man den Font verändert...
        Default Font ist derzeit noch der pygame Standard Font "freesansbold" ... Aber ähnlich wie lema67 möchte auch ich später unterschiedliche Größen verwenden.
      • Screensaver in eigene Funktion ausgelagert um später einfacher Erweiterungen zu implementieren und nicht nur einen 'blank screen'


    • Beta10

      • Aktuelle Uhrzeit+Datum als Screensaver, was alle 10 Sekunden auf eine zufällige Position wechselt.


    • ...und bestimmt auch noch ein paar andere Kleinigkeiten, woran ich mich aber jetzt nicht mehr erinnere... :daumendreh2:


    [hr]
    [hr]


    Eine optimale FPS Einstellung die i.d.R. reicht sind übrigens 3 also 3 Updates innerhalb einer Sekunde. Auf 2fps ist die GUI dann schon merklich träge - verursacht dann aber auch nur noch ca. 15% CPU Last im Gegensatz zu ca. 27%.
    Bei > 10 fps macht die Last zZt. kaum noch ein Unterschied und liegt bei ca. 45%.. Derzeit sind aber nicht mehr als ca. 10 FPS möglich da die update_screen() Funktion ausbremst, was ich statig versuche weiter zu optimieren.
    Aus Testgründen hab ichs aber zZt auf 60 fps stehen (wegen des Lauftext's)


    Nunja, jedenfalls möchte ich wie gesagt keine starren Skins verwenden sondern so ähnlich wie tuxerli >hier< einzelnen Bildern - allerdings will ich noch einen Schritt weiter gehen und das 'Sprite Sheets' Feature von pygame verwenden, wie es auch bei Spielen zum Einsatz kommt. Dabei kommt eine einzige Bilddatei zum Einsatz auf der alle benötigten Bilder angeordnet sind und über pygame kopiert man sich dann nur das jeweilige Abbild heraus. Das reduziert die Anzahl der Dateien und macht es auch etwas flexibler. Ein Beispiel hierfür kann man zB hier nachlesen: http://programarcadegames.com/…xamples/en/sprite_sheets/


    Auch hatte Greengecko in seinem Thread die Idee das jeweilige Cover von local abgespielten MP3's darzustellen, was ich später auch noch einbauen möchte.


    Ebenso wie weitere Informationen auf anderen "Fenstern", oder eben auch sowas wie "Verbleibende Zeit" des jeweiligen Tracks.


    Also weitere Möglichkeiten gäb es denk ich viele - dank der TRON-Radio Vorlage hat man zumindest schon mal eine brauchbare Basis die man erweitern kann :thumbs1:



    Builds:


    29.04.2015 22:29 -> Beta7 http://slexy.org/view/s20w8YfFak
    30.04.2015 23:31 -> Beta8 http://slexy.org/view/s21bipByjm
    01.05.2015 20:28 -> Beta9 http://slexy.org/view/s2bWpjj9AC




    Stay Tune!



    PS: Minimalistisches Web-Interface: https://github.com/sn0opy/MPD-Webinterface oder https://github.com/notandy/ympd

  • Soo, endlich hatte ich die Zeit dein Script zu testen. Anfangs hatte ich zwar noch ne Fehlermeldung wegen der Default Playlist, aber das war ja schnell behoben :)
    Hast ja schon mal ganz nette Funktionen eingebaut, die Volume Widerherstellung und das zweite Fenster sind echt top! :bravo2:


    Leider muss ich dir sagen das eine Kleinigkeit hinzugefügt werden sollte. Aktuell ist es nämlich so das bei Titel, die Umlaute im Namen enthalten, also Ä, Ö, Ü und Sonderzeichen, anstelle des Umlauts nur "Kauderwelsch" angezeigt wird. Im Original war das auch so und Abhilfe schaffte dann "decode UTF-8" in den Zeilen für Station, Titel usw. Wo das jetzt aber rein gehört wirst du besser wissen als ich :)


    Wie stellst du dir eigentlich das dritte Fenster mit dem Album Cover für lokale mp3s vor? Eigentlich könnten diese Covers doch auch als Screensaver eingesetzt werden und falls keine Bilddatei vorliegt kann man auf den schwarzen Bildschirm als Screensaver zurück greifen oder ist das too much?? :angel:


    Und für all diejenigen die es nicht wissen, warum wir auch Covers anzeigen wollen: weil der mpd weitaus mehr kann als im Tron Script. Bei Anschluss einer mit mp3s gefüllten USB Festplatte hat man nämlich einen Musik Server im Heimnetzwerk. Dann brauch man sich nur noch ein paar Playlisten erstellen und ist fast fertig. Da nun jeder ein Handy und/oder Tablet zur Verfügung hat, Google Play öffnen und "mpDroid" laden. Für die Apfel User gibt´s im AppStore ähnliches.


    Ich hab auf meinem Nexus7 den "mpDroid" laufen und kann bequem vom Sofa aus Playlisten erstellen, Titel suchen usw. Wenn das ganze noch nett aussehen soll, braucht man nur noch einen "Server" für die Covers installieren und konfigurieren.


    Ein Screenshot von "mpDroid":


    @ meigrafd
    Freu mich schon auf die nächste Beta und noch mehr auf deinen RC1 :danke_ATDE::danke_ATDE:

  • Um ein 2. oder 3.Fenster hab ich mir bisher keine Gedanken gemacht, da ich mich erst mal um die vorhandenen kümmern möchte ;) Nicht zu viele Baustellen auf ein mal aufreisen.



    Aktuell hab ich genügend FPS rausgekitzelt um einen einigermaßen vernünftigen (und auch schnellen) Lauftext hinzukriegen - allerdings kämpfe ich mit einem Problem:


    station_name ist zB länger als title_name , aber er hört auf zu scrollen sobald title_name links am Rand angekommen ist - also im Prinzip ist es egal welcher nun länger oder kürzer ist: sobald einer der Texte am Ende ankommt werden beide zurückgesetzt...
    Vorausgesetzt beide scrollen, was auch nur der Fall ist wenn die eine maximal Länge überschreiten.
    Also die Funktion wir schon für jeden Text separat aufgerufen - nur weil ein Text scrollt bedeutet das nicht das beide scrollen. Aber wie gesagt könnte es vorkommen das der Titel länger ist als der Name der Station (oder des Albums) und man ihn dann trotzdem nicht lesen kann da er beim erreichen des Endes vom Station_Names zurückgesetzt wird ...


    Ich hab nun versucht für jeden Text ein eigenes Dictionary anzulegen aber da meckert er jedes mal wenn ich prüfen will ob dies existiert (um die Startposition für den Text zu setzen).


    Hauptproblem ist halt leider, das bei jedem Frame die Funktion neu aufgerufen wird - wenn ich also sowohl Station als auch Songtitel scrollen lassen will, muss mir hier eine Lösung einfallen, wo ich aber leider seit 4 Stunden nicht drauf komme =(



    http://codepad.org/Yf4aQrR8



    :helpnew: --> lauftext2(screen, text, color, pos_x, pos_y) ... Zeile 603 bis 623 ist das Problem. Zur Demonstration ist aber zZt Zeile 626 bis 646 aktiv.


    //EDIT: Habs:


    [code=php]temp_x={}
    temp_x["station"]=None
    temp_x["songtitle"]=None
    def lauftext(screen, type, text, color, pos_x, pos_y):
    # x = horizontal. y = vertikal
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    w = text_rect[2] #breite des textes
    max_size_x = 170 #maximale breite die vom text genutzt werden kann
    #scrollen wenn text breiter/laenger..
    if w > max_size_x:
    if temp_x[type] == None:
    temp_x[type] = pos_x #startposition
    # scroll text by 3 pixels every time through
    temp_x[type] -= 3
    screen.blit(text_surface,(temp_x[type], pos_y))
    if temp_x[type] < -w:
    temp_x[type] = pos_x
    else: # it'll fit - so center
    screen.blit(text_surface, (pos_x, pos_y))[/php]


    http://codepad.org/uKHQgFBT


    :bravo2:

  • Is ja cool wie schnell du die Betas raus haust ;) Fühl mich wie ein Kind an Weihnachten :lol: kaum aufgewacht und schon das neue Spielzeug spielen


    Allerdings stimmt mit der Beta8 irgendwas nicht. Habe in jeder Zeile des Scripts 4 Leerzeichen entfernen müssen, da beim Starten immer wieder Fehlermeldungen kamen wie die Zeilen des Scripts. Naja, war ja schnell gemacht, aber jetzt läuft es zwar, nur wird im zweiten Fenster keiner der Computer Informationen mehr angezeigt.


    Da is bestimmt beim "Copy & Paste" irgendwas schief gelaufen, da es ja jede Zeile betrifft.



    PS: Ich will auch so coden können wie du :wallbash: verdammte "Schlangensprache" :lol::lol:


    Übrigens hatte ich vorhin noch ne Idee für den Screensaver, die bestimmt auch einfacher zu coden ist als das ganze mit den Albumcovers. Da die Uhrzeit ja sowieso schon im Script abgerufen wird, könnte man diese bestimmt auch bildschirmfüllend als Screensaver einsetzen??
    Und Einbrennen dürfte sich dann ja auch nix wenn die Sekunden schön mit laufen ....

  • Hallo meigrafd,


    zunächst einmal vielen Dank für Deine tolle Arbeit bei der Weiterentwicklung des Tron-Radio.
    Deine aktuelle Version mit beiden scrollenden Positionen bzgl. Station/Titel
    läßt die Schrift über den LCD Rand hinaus laufen.


    Vielleicht kann man das Script so ändern, das der Text innerhalb des großen ovalen
    Rahmens verschwindet, das sieht sauberer aus.
    Evtl. besteht ja auch die Möglichkeit, nur den Titel scrollen zu lassen und den
    Stationen Namen still stehen zu lassen.


    MfG Antheus

  • Hab mein Display aus dem Link von lema67 auch gestern bekommen ;)
    LCD: "Waveshare 3.2 - Spotpear ... RPi (V3)"
    KERNEL: root@WebRadio:/boot# uname -a
    Linux WebRadio 3.18.10+ #1 PREEMPT Fri Mar 27 17:08:57 CET 2015 armv6l GNU/Linux


    ...
    Text abgekürzt. War zwar kein Display-Setup Problem, jedoch (laut zwei Posts weiter) nicht gewünscht in diesem Thread.
    ...


    Jetzt geht zumindest alles mit "/dev/input/event0" statt "/dev/input/touchscreen"


    Nun geht es ans Testen ;)


    meigrafd, vielen Dank nochmal für die gelungene Weiterentwicklung. Mal schauen was noch so alles kommt bzw. uns als Erweiterungen einfällt...
    - ich muss mal schauen in der WebSeite meines mpd/mpc hatte ich mir einen Record-Button eingebaut, der die Internet-Streams per "streamripper" mitschneiden und als mp3s auf SD bzw. Netzlaufwerk ablegen kann. Evtl. kommt als Erweiterung noch eine Aufnahmefunktion ;)

    Edited once, last by giovanne ().


  • Hab mein Display aus dem Link von lema67 auch gestern bekommen ;)
    LCD: "Waveshare 3.2 - Spotpear ... RPi (V3)"
    ...


    Wer das gleiche Display mit den 3 Buttons an Rand hat könnte darüber z.B. auch zusätzliche Aktionen ausführen bzw. zw. Programmen umschalten. Z.B. das WebRadio starten, falls dies nicht sofort nach booten gestartet wird, zw. WebRadio und Smarthome Steuerung umschalten, zwischen X-Display und console umschalten, oder oder oder.


    Eine Beispiel-Script welches die drei Buttons händelt.
    Die Befehle darin sollen nur als Beispiele dienen.
    Für den korrekten Einsatz muss mach sicherlich weitere Intelligenz einbringen, wie z.B. mehrfach starten verhindern oder beenden von Scripten bevor neue gestartet werden, ...


    Edited once, last by giovanne ().

  • Danke für das Feedback.


    Leider ist das nicht ganz so einfach den Lauftext nicht über das Oval laufen zu lassen... pygame ist quasi in Layer aufgeteilt. Das Skin-Bild wird als erstes auf den Screen gelegt und fungiert somit als Hintergrund. Dadrüber wird der Text gelegt und läuft somit über den Hintergrund..


    Also entweder man entfernt vom Skin-Bild den oberen Rand und lässt das ganz weg, oder man zeichnet diesen oberen Bereich irgendwie neu - wobei das sich für mich zZt auch als schwierig erweißt da ich nicht weiß wie ich nur 1/4 eines Kreises zeichnen kann... pygame scheint keine Ovale zu unterstützen, nur ganze Kreise...
    Die einzige Idee die ich dazu momentan habe ist einen Kreis zu zeichnen und diesen dann an passender Stelle mit schwarz zu überdecken (gefülltes Rechteck drauf zeichnen). Allerdings wäre das ziemlich umständlich und dirty :(
    Die nächste Möglichkeit wäre nur einzelne Stücke aus schon erwähntem 'Sprite Sheets' heraus zu ziehen, also einer Bilddatei in dem Teile des Ovals vorhanden sind - und diese dann bei jedem Frame nachträglich über den Text zu legen... Das wäre aber ebenso dirty


    //EDIT: oder vielleicht http://www.pygame.org/docs/ref/draw.html#pygame.draw.arc aber das sieht "unsauber" aus.. hmmh :denker:


    giovanne: Dein Anliegen hat leider nichts mit diesem Thema hier zu tun. Bitte erstell dir zur Klärung deines Display-Setup-Problems einen eigenen Thread (und gewöhnt euch das bitte auch mal an nicht Offtopic zu posten)

  • Aha interessant - da scheint sich lema67 eines Tricks bedient zu haben :D Er schneidet den Text einfach Stück für Stück ab und erschafft so eine Illusion von Scrollen - auch nicht schlecht :thumbs1:


    Allerdings "scrollt" der Text damit nicht so sauber wie bei meiner echten Variante: große Buchstaben verursachen ein ruckartiges "scrollen" im Gegensatz zu kleinen - was mir noch nicht so gut gefällt :denker: Werd ich die Tage mal eine Kombination probieren...


    Über die von mir rausgekitzelten FPS hat man nun zumindest auch merklich Einfluss darauf wie schnell sich der Text bewegen soll... Ein Wert von 5 erscheint mir angenehm, wer es schneller mag kann das aber natürlich auch hoch auf (derzeit) 15 stellen :fies:



    Beta9 hau ich gleich mal raus und update obigen Beitrag...

  • Das sieht doch schon sehr gut aus.
    Wenn Du das jetzt auch noch für die rechte Seite hinbekommst ist es fast perfekt.
    Bei sehr langen Liedernamen ist der Scrolltext außerhalb des rechten Rahmen.
    Interessanter ist die Anzeige der Sendernamen.
    Bei der von mir angehängten tron-radio.py wird der Sendername als Name angezeigt,
    während in Deiner Version z.B. anstatt NJOY der Sender als ndr_njoy_mp3 angezeigt wird.
    Diesen Aspekt finde ich persönlich wichtiger als das scrollen.
    Die Reihenfolge legst natürlich Du fest :)


    MfG Antheus

  • Was funktioniert da denn nicht - Station oder SongtTitle scrollen?


    Kannst du mal versuchen den Code zu bearbeiten, nach 31 zu suchen (max_size) und dies mit 30 zu ersetzen - und dann prüfen ob das Scrollen wieder i.O. ist?


    Vielleicht liegt das aber auch am utf-8 decode, den ich erst nachträglich setze..

  • Das ändern auf 30 bewirkt nichts.
    Was wir meinen hat mit dem Scroll Vorgang nichts zu tun, der ist soweit OK.
    Das Problem sind die langen Titel, d.h. bei langen Songtiteln steht der angezeigte Titel über den rechten Rand hinaus.


    MfG Antheus

    Edited once, last by Antheus ().

  • meigrafd
    Ich habe die letzten zwei tage auch viel rumprobiert und bin teilweise auf eine cpu last von 11% gekommen bei einer Framerate von 30 (geht aber auch noch mehr ;) ).


    Nutze mal für die Textfelder noch die hintergrundfarbe

    Code
    title_label = font18.render(title.decode('utf-8',errors='ignore'), True, font_color, font_background)


    und anstelle von

    Code
    pygame.display.flip()
    nutze mal
    pygame.display.update()


    dann brauchst du in der update_screen nicht immer die ganze gui neu zeichnen, sondern kannst einfach Teilbereiche überpainten.
    Allerdings muss ich noch mein scrolltext überarbeiten.


    gruß lema67

  • lema67: mit einer FPS von 5 liegt die CPU Auslastung bei mir aktuell unter 5% ;) Auf 15 FPS liegt die Last bei max. 17% inkl. Debug Output...Wobei das Script mit Lauftext auf 15 FPS 2% mehr Last verursacht...
    (siehe Anhang)


    Ich hatte zwischendurch auch pygame.display.update() umgesetzt - siehe Spoiler im ersten Beitrag von Beta8 ... Allerdings brachte das bei mir keine Besserung da das Skinbild ja leider auch neu gezeichnet werden musste da dies deckend ist... Oder hast du das anders gemacht? ..Es sei denn du zeichnest jedes mal über den oberen Ovalen Bereich ein gefülltes schwarzes Quadrat rein?


    Und wie kommst du auf 30 FPS?
    Scrollt der Text dann nicht viel zu schnell? :-/


    ..und wozu Hintergrundfarbe? :D Wenn man keine angibt ist es doch transparent oder nicht? :s



    Antheus: Wenn man das Scrollen auf True stellt wird der Text immer an die lauftext() Funktion übergeben. Dort wird anhand max_size geprüft ob der Text zu lang ist (> 31) und falls das der Fall ist wird er zum gefakten scrollen umgewandelt - falls nicht wird er so gelassen.
    Nach meinen Tests ist die Fläche innerhalb des Ovals je nach Font bzw Font-Größe ca. 32 Grossbuchstaben breit (mit dem default Font). Mit etwas Abstand rechts und links müsste dann also 30 ein guter Wert sein.


    Bedeutet also das max_size auf jeden Fall etwas bewirkt :fies: Deshalb: Probiert mal mit dieser Einstellung bitte etwas rum und berichtet mir dann mit welchem Wert es keine Probleme gibt.
    Oder die Funktion mit folgendem ersetzen - da hab ich die Berechnung auf den utf-8 Text geändert anstatt das decoding erst später zu machen...:

  • Ich habe jetzt beide Änderungen von Dir bei mir eingesetzt.
    Mit einem size_max von 26 funktioniert nun auch bei mir die Anzeige von Antenne Münster.
    Leider werden dadurch natürlich die vorher sowieso funktionerenden Titel auf der rechten Seite nicht ganz ausgefüllt / angezeigt. Da muß man wohl einen Kompromis eingehen.


    Bin gespannt wie die richtige Anzeige der Sendernamen umgesetzt wird.


    MfG Antheus

    Edited once, last by Antheus ().

  • meigrafd


    Ich habe wohl meinen Post editiert, während Du geschrieben hast.
    Bei einem max_size von 31 wird der komplette Titel über die gesamte Fläche angezeigt und beginnt dann mit dem scrollen.
    Bei einem max_size von z.B. 26 wird der Titel eben um die Size Differenz abgekürzt dargestellt,
    d.h. der Titel wird nicht bis ganz nach rechts dargestellt.


    MfG Antheus

  • meigrafd
    Ich fülle bei mir den Bildschrim erst mit schwarz, und positioniere dann die tranzparenten Grafiken. Deshalb zerschiesst mir auch der Text nicht die Hintergrundgrafik da da ja nix ist.
    Trotzdem brauche ich jetzt für den Text eine Hintergrundfarbe sonst legt sich mittels update der neue Text über den alten da kann man dann nix mehr lesen.


    Damit der Scrolltext nicht zu schnell läuft gibts im main loop ein USEREVENT das den Text im Sekundentakt um eine Position nach links verschiebt, da ist jetzt die Framerate egal.