Caching für nOpacity

  • Moin,


    heute gibt es mal keine optischen Änderungen, vielmehr habe ich nOpacity von der Performance her optimiert, indem ich einen Cache für Icons und Fonts eingebaut habe. Der Cache wird beim Start vom Plugin und teilweise auch nach dem Start beim ersten DisplayChannel Aufruf geladen (erst da sind die Theme Farben geladen), also bevor der User mit dem Skin interagiert. Die Icons liegen dann schon alle als fertige cImages im Speicher, es muss also nichts mehr von der Platte geladen und per ImageMagick konvertiert werden. Zusätzlich werden auch die Hintergründe für die Menüelemente usw. schon im Vorfeld erzeugt, die wurden sonst auch immer erst beim Aufruf des Menüs erstellt. Auch für die Fonts, die sonst immer on the fly erzeugt wurden, habe ich einen Cache eingebaut, da ich festgestellt habe, dass das Erzeugen beim Menüaufruf auch so ca. 100ms gedauert hat.


    Insgesamt habe ich durch diese Optimierungen einiges an Performance herausgeholt. Auf meinem Entwicklungsrechner hat der Aufruf des Menüs so ca. 400ms gedauert, das passiert jetzt in unter 50 ms. Da muss ich mich z.B. gegenüber LCARS nicht mehr verstecken ;)


    Sobald sich etwas für den Cache relevantes ändert, wird der komplette Cache automatisch neu geladen. Dazu zählt die OSD Größe, das Theme und die Parameter im Setup. Wird z.B. die OSD Größe geändert, wird der Cache beim nächsten Aufruf eines Menüs neu geladen. Dadurch ist dieser Aufruf etwas verzögert. Ebenfalls lade ich den kompletten Cache neu, wenn das nOpacity Setup Menü verlassen wird. Aber all diese Aktionen macht man ja nicht so oft, deswegen sollte das ziemlich egal sein...und ewig dauert das ja auch nicht.


    Ich habe eine Logmessage eingebaut, sobald der Cache neu geladen wird. Kommt keine Logausgabe, bleibt auch der Cache unverändert. Bitte testet das mal mit euren verschiedenen Setups, ob das alles so passt. Ausserdem kann es durchaus sein, dass sich durch die Änderungen neue Bugs eingeschlichen haben, ich musste einiges auf den Kopf stellen, der commit im Git hatte über 2000 Änderungen, der diff für den Commit hat weit über 5000 Zeilen ;)

  • PS: auf schnelleren Maschinen ist der unterschied marginal, wirklich spürbar wird es auf langsameren Kisten...


    PS2: die Kanallogos habe ich bewusst aus dem Cache heraus gelassen. Zum einen wollte ich nicht alle Logos in den Speicher pumpen, und nur einen Teil der Logos zu cachen (z.B. die ersten Hundert in der Kanalliste) fand ich auch nicht so dolle, das verzögert das Laden des Caches um fast eine Sekunde. Zum anderen braucht man die Logos meistens (bis auf die "what's on now/next" Listen) eher einzeln, was für die Performance kaum eine Rolle spielt.


    Ciao Louis

  • Sehr schön, jetzt fluppt es auch auf meinem ION-System :D

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Auf dem Raspberry Pi läuft es auch recht schön flüssig (ohne Fading) - bislang ging da skinflat(plus) von den TrueColor Skins :bpl

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    Einmal editiert, zuletzt von seahawk1986 ()

  • Seit dem Update, sieht meine Lautstärkenanzeige etwas "komisch" aus:


    [Blockierte Grafik: http://imageshack.us/a/img546/1834/heac.jpg]


    An den Settings habe ich nichts geändert:


    Code
    vdr01_64 ~ # grep skinnopacity.volume /etc/vdr/setup.conf
    skinnopacity.volumeBorderBottom = 10
    skinnopacity.volumeFadeTime = 300
    skinnopacity.volumeHeight = 10
    skinnopacity.volumeWidth = 70
    vdr01_64 ~ #


    Woran könnte das liegen, bzw. wie kann ich das beheben?

  • Das mit dem Lautstärkebalken tritt bei mir auch auf.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hab selbes Verhalten wie 3PO.


    Ein fettes Danke von mir an dieser Stelle, ich habe nicht gerade die langsamste Kiste und es ist deutlich flotter geworden!


    Edit: Beim Muten wird der schmale Dialog mit dem durchgestrichenen Lautsprecher auch von der breiten Anzeige überlagert.

    VDR: yavdr-ansible/22.04 LTS auf Intel NUC (BOXNUC6CAYH), 2x Kingston KVR16LS11/4, One For All URC 2981

    VDR-Server: yavdr-ansible/22.04 LTS in ESXi VM

  • Ich tippe mal auf die letzte Funktion in geometrymanager.c:

    Code
    void cGeometryManager::SetDisplayVolumeSizes(void) {
        volumeWidth = osdWidth * config.volumeWidth / 100;
        volumeHeight = osdHeight * config.volumeHeight / 100;
        volumeLabelHeight = volumeHeight/3;
        volumeProgressBarWidth = 0.9 * volumeWidth;
        volumeProgressBarHeight = 0.3 * volumeWidth;
        if (volumeProgressBarHeight%2 != 0)
            volumeProgressBarHeight++;
    }


    volumeProgressBarHeight sollte vermutlich aus volumeHeight und nicht aus volumeWidth berechnet werden:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Moin,


    das mit der Volume Anzeige war noch ein Bug...sollte im Git gefixt sein.


    Freut mich, dass es Performancetechnisch spürbar ist. Wie lange dauert denn das Cache Neuladen auf einer langsamen Kiste (z.B. Atom oder RPI)? EInfach mal das Theme wechseln und ins Log schauen...


    Ciao Louis

  • @seahawk: ja das wars ;)


    Da ich alle Größen für das Caching schon beim Start brauche, habe ich das komplett externalisiert...vorher war das in den jeweiligen Klassen. Da ist mir was verrutscht.


    Ciao Louis

  • Bei mir sieht das auf dem Atom 330 so aus:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Du kannst doch die Channel Logos einfach Cachen.
    Eine Hashtabelle. Wenn Logo benötigt wird, in Hashtabelle gucken, wenn vorhanden verwenden, wenn nicht vorhanden laden und in Tabelle eintragen. Wenn Platz bereits von falschen Logo belegt ist, dies löschen, neues laden und in Tabelle eintragen.


    Das Ganze braucht nur ein paar Zeilen mehr Code und bringt Unmenge an Performance.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Danke für den Fix im Git, sieht gut aus jetzt ist alles wie es sein soll.

    VDR: yavdr-ansible/22.04 LTS auf Intel NUC (BOXNUC6CAYH), 2x Kingston KVR16LS11/4, One For All URC 2981

    VDR-Server: yavdr-ansible/22.04 LTS in ESXi VM

  • Du kannst doch die Channel Logos einfach Cachen.
    Eine Hashtabelle. Wenn Logo benötigt wird, in Hashtabelle gucken, wenn vorhanden verwenden, wenn nicht vorhanden laden und in Tabelle eintragen. Wenn Platz bereits von falschen Logo belegt ist, dies löschen, neues laden und in Tabelle eintragen.



    Jo wie das geht ist mir klar...so mache ich das ja auch mit den Icons ;) Wie ich oben aber schon geschrieben habe, würden mit der Methode (wenn ich mich z.B. in der "what's on now" Liste durch das Programm klicke, der Cache mit sehr vielen Logos gefüllt werden, bei Leuten mit sehr vielen Sendern würde das den Speicherbedarf ganz schön nach oben treiben.



    Das Ganze braucht nur ein paar Zeilen mehr Code und bringt Unmenge an Performance.


    Den riesigen Performancevorteil sehe ich eben nicht. Ein Logo auf die herkömmliche Weise zu laden, dauert ca. 3ms. I.d.r. wird pro Ausgabe ein Logo dargestellt...


    Ciao Louis

  • @Seahawk: grml, du hast genau das gemacht, bei dem im Log nicht ausgegeben wird, wie lange das Laden des Caches dauert ;) Kannst du entweder mal das Fenster von der Größe her verändern oder innerhalb von nOpacity das Theme?


    Ciao Louis

  • Ok, dann so:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Danke :D


    Hm, knapp 700ms...das ist schon ein Wort.


    @Seahawk: ändert ihr in yavdr eigentlich irgendwo die Ausgabegröße? Beim PIP oder sonstwo? Oder bleibt die i.d.r. konstant?


    Ciao Louis

  • Auch hier ist ein deutlicher Schub zu merken - Cool das! :tup

  • Mir ist noch gerade was aufgefallen:


    Mein TV ist jetzt aktuell nicht so riesig, aber ich denke für Leute mit richtig großen Bildschirmen macht es durchaus Sinn die Kanalwechsel Anzeige in der Breite zu verkleinern, damit man schnell alle Infos auf einen Blick erfassen kann.


    Tut man dies aber wird die Einstellung volle OSD Breite ad absurdum geführt, weil das Kanallogo nicht mit wandert, das sind Kleinigkeiten...


    Es wäre aber konsequent, wenn das Logo um die eingestellte Pixelanzahl mit wandern würde.

    VDR: yavdr-ansible/22.04 LTS auf Intel NUC (BOXNUC6CAYH), 2x Kingston KVR16LS11/4, One For All URC 2981

    VDR-Server: yavdr-ansible/22.04 LTS in ESXi VM

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!