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.