( XMI | 2023. 06. 10., szo – 16:03 )

Kiváló! Ha már így szóba hoztad a vektorgrafikus ábrákat... miből is állnak tipikusan? B-spline-okkal határolt területek, kitöltve egy színnel vagy színátmenettel, esetleg áttetszően. (Lehet vitatkozni rajta, hogy most B-spline vagy Bézier-görbe, nem ugyanaz a kettő, de a renderelési algoritmusa elég hasonló.) Mesélj róla, hogy lehet X11 (pontosabban xcb) drawing primitve-ekkel ezt megoldani? Segítek, itt egy doksi hozzá. Ha azt akarod, hogy a renderelt shape ne windows 3.1-stílusban nézzen ki (törtvonalas közelítés elég finom legyen, a gradient ne 8db diszkrét színsávból álljon stb), akkor becsüld meg kb, hogy hány darab hívást kell a kliensnek az X szerver fele elküldenie.

Átlátszóság? Kíváncsi vagyok hogy oldod meg, tekintve, hogy a drawing primitive-eknél csak bináris bitmaszk van. Persze vannak hack-ek, 32bites display esetére - amire nem mindig számíthatsz, ezért kell fallback megoldásodnak is lennie - és ráadásul ez a megoldás is pixmap-ek piszkálására épít.

És akkor nézzük miből is áll egy hívás:

Kliens alkalmazás:

1. összerakja a paramétereket egy struct-ba

2. szerializálja wire protokolra (xlib vagy xcb közül valamelyik library csinálja meg neked)

3. elküldi IPC-n (socketen vagy shared memory-n)

X Server:

4. fogadja az IPC-n

5. deszerializálja

6. végrehajtja a rajzolást

7. összerakja a választ

8. szerializálja a választ

9. elküldi IPC-n

Kliens alkalmazás:

10. fogadja IPC-n

11. deszerializálja

12. készen van, kliens megkapta a visszatérési értéket

Ebben van alsó hangon 4db kontextusváltás. Shared memory-val valamelyest kevesebb az overhead, nem kell socketen másolgatni, de szinkronizálás miatt kontextusváltás akkor is van.

Mi ez, ha nem bloat?

Egy shape kirajzolásához ezt kb 100-as nagyságrendben fogod pörgetni. Ehhez képest, ha a kliens saját libbel, saját pixmapbe maga rendereli az egészet, akkor csak a "végrehajtja a rajzolást" c. művelet ismétlődik sokszor, kontextusváltások, IPC, szerializálás/deszerializálások nélkül. Aztán a végén 1db PutImage-el átpattintja az X szervernek az egészet. Nagyságrendekkel gyorsabb.

A Wayland pedig meg tudja oldani, hogy mindenféle kerülőutas hack nélkül a kliens alkalmazás pixmap-je már kapásból a GPU memóriájában jöjjön létre, és a kliens library tudjon GPU gyorsítva rajzoltatni bele.